[Lldb-commits] [lldb] 1692611 - [lldb] Only set the executable module for a target once
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 16 23:36:05 PDT 2020
Author: Raphael Isemann
Date: 2020-07-17T08:35:38+02:00
New Revision: 16926115ed28d1370bca1085dfb1b20c842b0ffb
URL: https://github.com/llvm/llvm-project/commit/16926115ed28d1370bca1085dfb1b20c842b0ffb
DIFF: https://github.com/llvm/llvm-project/commit/16926115ed28d1370bca1085dfb1b20c842b0ffb.diff
LOG: [lldb] Only set the executable module for a target once
Summary:
When we try to find the executable module for our target we don't check
if we already have an executable module set. This causes that when debugging
a program that dlopens another executable, LLDB will take that other executable
as the new executable of the target (which causes that future launches of the
target will launch the dlopen'd executable instead of the original executable).
This just adds a check that we only set the executable when we haven't already
found one.
Fixes rdar://63443099
Reviewers: jasonmolenda, jingham, teemperor
Reviewed By: jasonmolenda, teemperor
Subscribers: jingham, JDevlieghere
Differential Revision: https://reviews.llvm.org/D80724
Added:
lldb/test/API/functionalities/dlopen_other_executable/Makefile
lldb/test/API/functionalities/dlopen_other_executable/TestDlopenOtherExecutable.py
lldb/test/API/functionalities/dlopen_other_executable/main.c
lldb/test/API/functionalities/dlopen_other_executable/other.c
Modified:
lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp
index 731004340434..569d84d39c80 100644
--- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp
+++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp
@@ -577,7 +577,8 @@ void DynamicLoaderDarwin::UpdateSpecialBinariesFromNewImageInfos(
}
}
- if (exe_idx != UINT32_MAX) {
+ // Set the target executable if we haven't found one so far.
+ if (exe_idx != UINT32_MAX && !target.GetExecutableModule()) {
const bool can_create = true;
ModuleSP exe_module_sp(FindTargetModuleForImageInfo(image_infos[exe_idx],
can_create, nullptr));
diff --git a/lldb/test/API/functionalities/dlopen_other_executable/Makefile b/lldb/test/API/functionalities/dlopen_other_executable/Makefile
new file mode 100644
index 000000000000..113b9fd7d3f1
--- /dev/null
+++ b/lldb/test/API/functionalities/dlopen_other_executable/Makefile
@@ -0,0 +1,8 @@
+C_SOURCES := main.c
+USE_LIBDL := 1
+
+other:
+ $(MAKE) -f $(MAKEFILE_RULES) C_SOURCES=other.c EXE=other
+all: other
+
+include Makefile.rules
diff --git a/lldb/test/API/functionalities/dlopen_other_executable/TestDlopenOtherExecutable.py b/lldb/test/API/functionalities/dlopen_other_executable/TestDlopenOtherExecutable.py
new file mode 100644
index 000000000000..2ccfaeaea41a
--- /dev/null
+++ b/lldb/test/API/functionalities/dlopen_other_executable/TestDlopenOtherExecutable.py
@@ -0,0 +1,42 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipIfRemote
+ @skipIfWindows
+ # glibc's dlopen doesn't support opening executables.
+ # https://sourceware.org/bugzilla/show_bug.cgi?id=11754
+ @skipIfLinux
+ @no_debug_info_test
+ def test(self):
+ self.build()
+ # Launch and stop before the dlopen call.
+ lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.c"))
+
+ # Delete the breakpoint we no longer need.
+ self.target().DeleteAllBreakpoints()
+
+ # Check that the executable is the test binary.
+ self.assertEqual(self.target().GetExecutable().GetFilename(), "a.out")
+
+ # Continue so that dlopen is called.
+ breakpoint = self.target().BreakpointCreateBySourceRegex(
+ "// break after dlopen", lldb.SBFileSpec("main.c"))
+ self.assertNotEqual(breakpoint.GetNumResolvedLocations(), 0)
+ stopped_threads = lldbutil.continue_to_breakpoint(self.process(), breakpoint)
+ self.assertEqual(len(stopped_threads), 1)
+
+ # Check that the executable is still the test binary and not "other".
+ self.assertEqual(self.target().GetExecutable().GetFilename(), "a.out")
+
+ # Kill the process and run the program again.
+ err = self.process().Kill()
+ self.assertTrue(err.Success(), str(err))
+
+ # Test that we hit the breakpoint after dlopen.
+ lldbutil.run_to_breakpoint_do_run(self, self.target(), breakpoint)
diff --git a/lldb/test/API/functionalities/dlopen_other_executable/main.c b/lldb/test/API/functionalities/dlopen_other_executable/main.c
new file mode 100644
index 000000000000..8f21e862a2b5
--- /dev/null
+++ b/lldb/test/API/functionalities/dlopen_other_executable/main.c
@@ -0,0 +1,10 @@
+#include <dlfcn.h>
+#include <assert.h>
+
+int main() {
+ int i = 0; // break here
+ // dlopen the 'other' test executable.
+ int h = dlopen("other", RTLD_LAZY);
+ assert(h && "dlopen failed?");
+ return i; // break after dlopen
+}
diff --git a/lldb/test/API/functionalities/dlopen_other_executable/other.c b/lldb/test/API/functionalities/dlopen_other_executable/other.c
new file mode 100644
index 000000000000..237c8ce18177
--- /dev/null
+++ b/lldb/test/API/functionalities/dlopen_other_executable/other.c
@@ -0,0 +1 @@
+int main() {}
More information about the lldb-commits
mailing list