aboutsummaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorRafael Auler <rafaelauler@gmail.com>2015-07-13 23:52:58 +0000
committerRafael Auler <rafaelauler@gmail.com>2015-07-13 23:52:58 +0000
commita4917f74ebd6744d52578a709666fe8d4ddf968e (patch)
tree852f5fca517f5b03efb2019aee565043fa115b8a /lld
parent8a4145411f0e2454d54a2cfdabb7292d8954fca7 (diff)
downloadllvm-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.cpp2
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);
}