mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-02 07:06:33 +00:00
[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:
parent
8a4145411f
commit
a4917f74eb
@ -362,7 +362,7 @@ template <class ELFT> void Segment<ELFT>::assignVirtualAddress(uint64_t addr) {
|
|||||||
|
|
||||||
// Set the segment memory size and the virtual address.
|
// Set the segment memory size and the virtual address.
|
||||||
this->setMemSize(curSliceAddress - startAddr + curSliceSize);
|
this->setMemSize(curSliceAddress - startAddr + curSliceSize);
|
||||||
this->setVirtualAddr(curSliceAddress);
|
this->setVirtualAddr(startAddr);
|
||||||
std::stable_sort(_segmentSlices.begin(), _segmentSlices.end(),
|
std::stable_sort(_segmentSlices.begin(), _segmentSlices.end(),
|
||||||
SegmentSlice<ELFT>::compare_slices);
|
SegmentSlice<ELFT>::compare_slices);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user