This revision was automatically updated to reflect the committed changes.
Closed by commit rG879a47a55ffb: Add the ability to debug through an exec into 
ld (authored by clayborg).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125253/new/

https://reviews.llvm.org/D125253

Files:
  lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
  lldb/test/API/functionalities/dyld-exec-linux/Makefile
  lldb/test/API/functionalities/dyld-exec-linux/TestDyldExecLinux.py
  lldb/test/API/functionalities/dyld-exec-linux/main.cpp

Index: lldb/test/API/functionalities/dyld-exec-linux/main.cpp
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/dyld-exec-linux/main.cpp
@@ -0,0 +1,16 @@
+#include <unistd.h>
+
+int main(int argc, const char *argv[], const char *envp[]) {
+  if (argc == 2) {
+    // If we have two arguments the first is the path to this executable,
+    // the second is the path to the linux dynamic loader that we should
+    // exec with. We want to re-run this problem under the dynamic loader
+    // and make sure we can hit the breakpoint in the "else".
+    const char *interpreter = argv[1];
+    const char *this_program = argv[0];
+    const char *exec_argv[3] = {interpreter, this_program, nullptr};
+    execve(interpreter, (char *const *)exec_argv, (char *const *)envp);
+  }
+  // Break here
+  return 0;
+}
Index: lldb/test/API/functionalities/dyld-exec-linux/TestDyldExecLinux.py
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/dyld-exec-linux/TestDyldExecLinux.py
@@ -0,0 +1,61 @@
+"""
+Test that LLDB can launch a linux executable and then execs into the dynamic
+loader into this program again.
+"""
+
+import lldb
+import os
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestLinux64ExecViaDynamicLoader(TestBase):
+    mydir = TestBase.compute_mydir(__file__)
+
+    @skipIf(oslist=no_match(['linux']))
+    @no_debug_info_test
+    @skipIf(oslist=["linux"], archs=["arm"])
+    def test(self):
+        self.build()
+
+        # Extracts path of the interpreter.
+        exe = self.getBuildArtifact("a.out")
+
+        spec = lldb.SBModuleSpec()
+        spec.SetFileSpec(lldb.SBFileSpec(exe))
+        interp_section = lldb.SBModule(spec).FindSection(".interp")
+        if not interp_section:
+          return
+        section_data = interp_section.GetSectionData()
+        error = lldb.SBError()
+        dyld_path = section_data.GetString(error,0)
+        if error.Fail():
+          return
+
+        target = self.dbg.CreateTarget(exe)
+        self.assertTrue(target, VALID_TARGET)
+
+        # Set a breakpoint in the main function that will get hit after the
+        # program exec's via the dynamic loader. The breakpoint will only get
+        # hit if we can successfully read the shared library lists in the
+        # DynamicLoaderPOSIXDYLD.cpp when we exec into the dynamic loader.
+        breakpoint_main = target.BreakpointCreateBySourceRegex("// Break here", lldb.SBFileSpec("main.cpp"))
+        # Setup our launch info to supply the dynamic loader path to the
+        # program so it gets two args:
+        # - path to a.out
+        # - path to dynamic loader
+        launch_info = lldb.SBLaunchInfo([dyld_path])
+        error = lldb.SBError()
+        process = target.Launch(launch_info, error)
+        self.assertSuccess(error)
+
+        threads = lldbutil.get_stopped_threads(process, lldb.eStopReasonExec)
+        self.assertEqual(len(threads), 1, "We got a thread stopped for exec.")
+
+        process.Continue();
+
+        # Stopped on main here.
+        self.assertEqual(process.GetState(), lldb.eStateStopped)
+        thread = process.GetSelectedThread()
+        self.assertIn("main", thread.GetFrameAtIndex(0).GetDisplayFunctionName())
Index: lldb/test/API/functionalities/dyld-exec-linux/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/dyld-exec-linux/Makefile
@@ -0,0 +1,2 @@
+CXX_SOURCES := main.cpp
+include Makefile.rules
Index: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
===================================================================
--- lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
+++ lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
@@ -309,7 +309,7 @@
   addr_t break_addr;
   Target &target = m_process->GetTarget();
   BreakpointSP dyld_break;
-  if (m_rendezvous.IsValid()) {
+  if (m_rendezvous.IsValid() && m_rendezvous.GetBreakAddress() != 0) {
     break_addr = m_rendezvous.GetBreakAddress();
     LLDB_LOG(log, "Setting rendezvous break address for pid {0} at {1:x}",
              m_process ? m_process->GetID() : LLDB_INVALID_PROCESS_ID,
@@ -565,7 +565,7 @@
   FileSpec file(info.GetName().GetCString());
   ModuleSpec module_spec(file, target.GetArchitecture());
 
-  if (ModuleSP module_sp = target.GetOrCreateModule(module_spec, 
+  if (ModuleSP module_sp = target.GetOrCreateModule(module_spec,
                                                     true /* notify */)) {
     UpdateLoadedSections(module_sp, LLDB_INVALID_ADDRESS, m_interpreter_base,
                          false);
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to