"""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"]) 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)