| """ | |
| Test that LLDB can launch a linux executable through the dynamic loader where | |
| the main executable has an extra exported "_r_debug" symbol that used to mess | |
| up shared library loading with DYLDRendezvous and the POSIX dynamic loader | |
| plug-in. What used to happen is that any shared libraries other than the main | |
| executable and the dynamic loader and VSDO would not get loaded. This test | |
| checks to make sure that we still load libraries correctly when we have | |
| multiple "_r_debug" symbols. See comments in the main.cpp source file for full | |
| details on what the problem is. | |
| """ | |
| import lldb | |
| import os | |
| from lldbsuite.test import lldbutil | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| @skipIfTargetDoesNotSupportSharedLibraries() | |
| class TestDyldWithMultipleRDebug(TestBase): | |
| @skipIf(oslist=no_match(["linux"])) | |
| @no_debug_info_test | |
| def test(self): | |
| self.build() | |
| # Run to a breakpoint in main.cpp to ensure we can hit breakpoints | |
| # in the main executable. Setting breakpoints by file and line ensures | |
| # that the main executable was loaded correctly by the dynamic loader | |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( | |
| self, "// Break here", lldb.SBFileSpec("main.cpp"), extra_images=["testlib"] | |
| ) | |
| # Set breakpoints both on shared library function to ensure that | |
| # we hit a source breakpoint in the shared library which only will | |
| # happen if we load the shared library correctly in the dynamic | |
| # loader. | |
| lldbutil.continue_to_source_breakpoint( | |
| self, | |
| process, | |
| "// Library break here", | |
| lldb.SBFileSpec("library_file.cpp", False), | |
| ) |