jasonmolenda created this revision.
jasonmolenda added a reviewer: JDevlieghere.
jasonmolenda added a project: LLDB.
Herald added a project: All.
jasonmolenda requested review of this revision.
Herald added a subscriber: lldb-commits.

ObjectFileMachO::SetLoadAddress() takes a slide or base load address and 
applies the correct address difference to each section in the Target.  It only 
makes these changes to "loadable" sections and one of the heuristics 
incorrectly disqualified a DATA segment that has no on-disk content, e.g. a 
BSS-only DATA segment.  A DATA segment is allowed to have no file size; this is 
a small patch to SectionIsLoadable to recognize that.  And add a quick test 
case.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D154037

Files:
  lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
  lldb/test/API/macosx/bss-only-data-section-sliding/Makefile
  
lldb/test/API/macosx/bss-only-data-section-sliding/TestBSSOnlyDataSectionSliding.py
  lldb/test/API/macosx/bss-only-data-section-sliding/main.c


Index: lldb/test/API/macosx/bss-only-data-section-sliding/main.c
===================================================================
--- /dev/null
+++ lldb/test/API/macosx/bss-only-data-section-sliding/main.c
@@ -0,0 +1,2 @@
+int glob = 0;
+int main() { return glob; }
Index: 
lldb/test/API/macosx/bss-only-data-section-sliding/TestBSSOnlyDataSectionSliding.py
===================================================================
--- /dev/null
+++ 
lldb/test/API/macosx/bss-only-data-section-sliding/TestBSSOnlyDataSectionSliding.py
@@ -0,0 +1,27 @@
+"""Test that we a BSS-data only DATA segment is slid with other segments."""
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestBSSOnlyDataSectionSliding(TestBase):
+    @skipUnlessDarwin
+    def test_with_python_api(self):
+        """Test that we get thread names when interrupting a process."""
+        self.build()
+        exe = self.getBuildArtifact("a.out")
+
+        target = self.dbg.CreateTarget(exe, "", "", False, lldb.SBError())
+        self.assertTrue(target, VALID_TARGET)
+
+        module = target.modules[0]
+        self.assertTrue(module.IsValid())
+        data_sect = module.section["__DATA"]
+        self.assertTrue(data_sect.IsValid())
+
+        target.SetModuleLoadAddress(module, 0x170000000)
+        self.assertEqual(
+            data_sect.GetFileAddress() + 0x170000000, 
data_sect.GetLoadAddress(target)
+        )
Index: lldb/test/API/macosx/bss-only-data-section-sliding/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/macosx/bss-only-data-section-sliding/Makefile
@@ -0,0 +1,3 @@
+C_SOURCES := main.c
+
+include Makefile.rules
Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
===================================================================
--- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -6048,7 +6048,8 @@
   if (!section)
     return false;
   const bool is_dsym = (m_header.filetype == MH_DSYM);
-  if (section->GetFileSize() == 0 && !is_dsym)
+  if (section->GetFileSize() == 0 && !is_dsym &&
+      section->GetName() != GetSegmentNameDATA())
     return false;
   if (section->IsThreadSpecific())
     return false;


Index: lldb/test/API/macosx/bss-only-data-section-sliding/main.c
===================================================================
--- /dev/null
+++ lldb/test/API/macosx/bss-only-data-section-sliding/main.c
@@ -0,0 +1,2 @@
+int glob = 0;
+int main() { return glob; }
Index: lldb/test/API/macosx/bss-only-data-section-sliding/TestBSSOnlyDataSectionSliding.py
===================================================================
--- /dev/null
+++ lldb/test/API/macosx/bss-only-data-section-sliding/TestBSSOnlyDataSectionSliding.py
@@ -0,0 +1,27 @@
+"""Test that we a BSS-data only DATA segment is slid with other segments."""
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestBSSOnlyDataSectionSliding(TestBase):
+    @skipUnlessDarwin
+    def test_with_python_api(self):
+        """Test that we get thread names when interrupting a process."""
+        self.build()
+        exe = self.getBuildArtifact("a.out")
+
+        target = self.dbg.CreateTarget(exe, "", "", False, lldb.SBError())
+        self.assertTrue(target, VALID_TARGET)
+
+        module = target.modules[0]
+        self.assertTrue(module.IsValid())
+        data_sect = module.section["__DATA"]
+        self.assertTrue(data_sect.IsValid())
+
+        target.SetModuleLoadAddress(module, 0x170000000)
+        self.assertEqual(
+            data_sect.GetFileAddress() + 0x170000000, data_sect.GetLoadAddress(target)
+        )
Index: lldb/test/API/macosx/bss-only-data-section-sliding/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/macosx/bss-only-data-section-sliding/Makefile
@@ -0,0 +1,3 @@
+C_SOURCES := main.c
+
+include Makefile.rules
Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
===================================================================
--- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -6048,7 +6048,8 @@
   if (!section)
     return false;
   const bool is_dsym = (m_header.filetype == MH_DSYM);
-  if (section->GetFileSize() == 0 && !is_dsym)
+  if (section->GetFileSize() == 0 && !is_dsym &&
+      section->GetName() != GetSegmentNameDATA())
     return false;
   if (section->IsThreadSpecific())
     return false;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits] [PATCH] ... Jason Molenda via Phabricator via lldb-commits

Reply via email to