llvm-objcopy: Change sectionWithinSegment() to use virtual addresses instead of file offsets for SHT_NOBITS sections.

Without this, sectionWithinSegment() will return the wrong answer for bss
sections. This doesn't seem to matter now (for non-broken ELF files), but
it will matter with a change that I'm working on.

Differential Revision: https://reviews.llvm.org/D58426

llvm-svn: 361578
This commit is contained in:
Peter Collingbourne 2019-05-24 00:21:46 +00:00
parent 55229f6b10
commit ab09cca310
1 changed files with 14 additions and 0 deletions

View File

@ -809,6 +809,20 @@ static bool sectionWithinSegment(const SectionBase &Section,
// segments and ensures that the section "belongs" to the second segment and
// not the first.
uint64_t SecSize = Section.Size ? Section.Size : 1;
if (Section.Type == SHT_NOBITS) {
if (!(Section.Flags & SHF_ALLOC))
return false;
bool SectionIsTLS = Section.Flags & SHF_TLS;
bool SegmentIsTLS = Segment.Type == PT_TLS;
if (SectionIsTLS != SegmentIsTLS)
return false;
return Segment.VAddr <= Section.Addr &&
Segment.VAddr + Segment.MemSize >= Section.Addr + SecSize;
}
return Segment.Offset <= Section.OriginalOffset &&
Segment.Offset + Segment.FileSize >= Section.OriginalOffset + SecSize;
}