Recognize BSS-only DATA segments as sections that need to be slid

ObjectFileMachO::SetLoadAddress() should allow for a DATA segment
that has no file content to be slid in the vmaddr, it is valid
to have such a section.

Differential Revision: https://reviews.llvm.org/D154037
rdar://99744343
This commit is contained in:
Jason Molenda
2023-06-29 17:50:21 -07:00
parent 35bb2bb21c
commit 623e845591
4 changed files with 34 additions and 1 deletions

View File

@@ -6048,7 +6048,8 @@ bool ObjectFileMachO::SectionIsLoadable(const Section *section) {
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;

View File

@@ -0,0 +1,3 @@
C_SOURCES := main.c
include Makefile.rules

View File

@@ -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)
)

View File

@@ -0,0 +1,2 @@
int glob = 0;
int main() { return glob; }