The test has a check that the static linker supports the new option, but it assumed the Xcode 16 linker also meant it was running on macOS 15 and the dynamic linker would honor dependencies flagged this way. But Xcode 16 can be run on macOS 14.5, so we need to skip the test in that combination.
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
"""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)
|