forked from OSchip/llvm-project
[ELF] Fix SysV hash tables with --no-rosegment
When setting up the chain, we copy over the bucket's previous symbol index, assuming that this index will be 0 (STN_UNDEF) for an unused bucket (marking the end of the chain). When linking with --no-rosegment, however, unused buckets will in fact contain the padding value, and so the hash table will end up containing invalid chains. Zero out the hash table section explicitly to avoid this, similar to what's already done for GNU hash sections. Differential Revision: https://reviews.llvm.org/D41928 llvm-svn: 322259
This commit is contained in:
parent
bb9c6fc3bc
commit
d79bbf4474
|
@ -1836,6 +1836,9 @@ void HashTableSection::finalizeContents() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void HashTableSection::writeTo(uint8_t *Buf) {
|
void HashTableSection::writeTo(uint8_t *Buf) {
|
||||||
|
// See comment in GnuHashTableSection::writeTo.
|
||||||
|
memset(Buf, 0, Size);
|
||||||
|
|
||||||
unsigned NumSymbols = InX::DynSymTab->getNumSymbols();
|
unsigned NumSymbols = InX::DynSymTab->getNumSymbols();
|
||||||
|
|
||||||
uint32_t *P = reinterpret_cast<uint32_t *>(Buf);
|
uint32_t *P = reinterpret_cast<uint32_t *>(Buf);
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
# REQUIRES: x86
|
||||||
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
|
||||||
|
# RUN: ld.lld -shared --no-rosegment -o %t %t.o
|
||||||
|
# RUN: llvm-readobj -hash-table %t | FileCheck %s
|
||||||
|
|
||||||
|
# CHECK: HashTable {
|
||||||
|
# CHECK-NEXT: Num Buckets: 2
|
||||||
|
# CHECK-NEXT: Num Chains: 2
|
||||||
|
# CHECK-NEXT: Buckets: [1, 0]
|
||||||
|
# CHECK-NEXT: Chains: [0, 0]
|
||||||
|
# CHECK-NEXT: }
|
||||||
|
|
||||||
|
callq undef@PLT
|
Loading…
Reference in New Issue