Commit 62840bcc authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r322259:

------------------------------------------------------------------------
r322259 | smeenai | 2018-01-10 22:57:01 -0800 (Wed, 10 Jan 2018) | 11 lines

[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: 322642
parent c559574c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1823,6 +1823,9 @@ void HashTableSection::finalizeContents() {
}

void HashTableSection::writeTo(uint8_t *Buf) {
  // See comment in GnuHashTableSection::writeTo.
  memset(Buf, 0, Size);

  unsigned NumSymbols = InX::DynSymTab->getNumSymbols();

  uint32_t *P = reinterpret_cast<uint32_t *>(Buf);
+13 −0
Original line number Diff line number Diff line
# 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