[LinkerScript] Fix bug in Segment::assignVirtualAddress()

When calculating the start address and size of a segment, lld mistakenly
attributed the start address of the last segment slice to the whole segment
when it should consider the start address of the first slice. In this case, in a
multi-slice segment, Segment::assignVirtualAddress() will return a wrong
segment start address to TargetLayout::assignVirtualAddress(). The effect of
this miscalculation is to allocate some program headers in unnecessarily far
away addresses. This commit fixes this.

Differential Revision: http://reviews.llvm.org/D10951

llvm-svn: 242089
This commit is contained in:
Rafael Auler 2015-07-13 23:52:58 +00:00
parent 8a4145411f
commit a4917f74eb

View File

@ -362,7 +362,7 @@ template <class ELFT> void Segment<ELFT>::assignVirtualAddress(uint64_t addr) {
// Set the segment memory size and the virtual address.
this->setMemSize(curSliceAddress - startAddr + curSliceSize);
this->setVirtualAddr(curSliceAddress);
this->setVirtualAddr(startAddr);
std::stable_sort(_segmentSlices.begin(), _segmentSlices.end(),
SegmentSlice<ELFT>::compare_slices);
}