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