| """Test binaries with delay-init dependencies.""" | |
| import subprocess | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class TestDelayInitDependencies(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| @skipUnlessDarwin | |
| @skipIf(macos_version=["<", "15.0"]) | |
| @skipIfRemote | |
| def test_delay_init_dependency(self): | |
| TestBase.setUp(self) | |
| out = subprocess.run( | |
| ["xcrun", "ld", "-delay_library"], | |
| universal_newlines=True, | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.PIPE, | |
| ) | |
| if "delay_library missing" not in out.stderr: | |
| self.skipTest( | |
| "Skipped because the linker doesn't know about -delay_library" | |
| ) | |
| self.build() | |
| main_source = "main.c" | |
| exe = self.getBuildArtifact("a.out") | |
| lib = self.getBuildArtifact("libfoo.dylib") | |
| target = self.dbg.CreateTarget(exe) | |
| self.assertTrue(target, VALID_TARGET) | |
| # libfoo.dylib should not be in the target pre-execution | |
| for m in target.modules: | |
| self.assertNotEqual(m.GetFileSpec().GetFilename(), "libfoo.dylib") | |
| # This run without arguments will not load libfoo.dylib | |
| li = lldb.SBLaunchInfo([]) | |
| li.SetWorkingDirectory(self.getBuildDir()) | |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( | |
| self, "// break here", lldb.SBFileSpec("main.c"), li | |
| ) | |
| for m in target.modules: | |
| self.assertNotEqual(m.GetFileSpec().GetFilename(), "libfoo.dylib") | |
| process.Kill() | |
| self.dbg.DeleteTarget(target) | |
| # This run with one argument will load libfoo.dylib | |
| li = lldb.SBLaunchInfo([]) | |
| li.SetWorkingDirectory(self.getBuildDir()) | |
| li.SetArguments(["one-argument"], True) | |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( | |
| self, "// break here", lldb.SBFileSpec("main.c"), li | |
| ) | |
| found_libfoo = False | |
| for m in target.modules: | |
| if m.GetFileSpec().GetFilename() == "libfoo.dylib": | |
| found_libfoo = True | |
| self.assertTrue(found_libfoo) |