diff options
author | Rafael Auler <rafaelauler@gmail.com> | 2015-07-13 23:52:58 +0000 |
---|---|---|
committer | Rafael Auler <rafaelauler@gmail.com> | 2015-07-13 23:52:58 +0000 |
commit | a4917f74ebd6744d52578a709666fe8d4ddf968e (patch) | |
tree | 852f5fca517f5b03efb2019aee565043fa115b8a /lld | |
parent | 8a4145411f0e2454d54a2cfdabb7292d8954fca7 (diff) | |
download | llvm-a4917f74ebd6744d52578a709666fe8d4ddf968e.zip llvm-a4917f74ebd6744d52578a709666fe8d4ddf968e.tar.gz llvm-a4917f74ebd6744d52578a709666fe8d4ddf968e.tar.bz2 |
[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
Diffstat (limited to 'lld')
-rw-r--r-- | lld/lib/ReaderWriter/ELF/SegmentChunks.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/lld/lib/ReaderWriter/ELF/SegmentChunks.cpp b/lld/lib/ReaderWriter/ELF/SegmentChunks.cpp index 9f4c89f..8b9e02a 100644 --- a/lld/lib/ReaderWriter/ELF/SegmentChunks.cpp +++ b/lld/lib/ReaderWriter/ELF/SegmentChunks.cpp @@ -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); } |