summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShoaib Meenai <smeenai@fb.com>2018-01-11 06:57:01 +0000
committerShoaib Meenai <smeenai@fb.com>2018-01-11 06:57:01 +0000
commitd79bbf4474d52ca2dd6c87b0b51fb4d819f65c9c (patch)
tree2be1bc97b010a009a16abaef533f1b28a42761e7
parentbb9c6fc3bce245fec88ead7fbe3bda93646c2add (diff)
downloadbcm5719-llvm-d79bbf4474d52ca2dd6c87b0b51fb4d819f65c9c.tar.gz
bcm5719-llvm-d79bbf4474d52ca2dd6c87b0b51fb4d819f65c9c.zip
[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
-rw-r--r--lld/ELF/SyntheticSections.cpp3
-rw-r--r--lld/test/ELF/sysv-hash-no-rosegment.s13
2 files changed, 16 insertions, 0 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index c83afcf72e4..36e3ffa284e 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -1836,6 +1836,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);
diff --git a/lld/test/ELF/sysv-hash-no-rosegment.s b/lld/test/ELF/sysv-hash-no-rosegment.s
new file mode 100644
index 00000000000..31b9d2fbec0
--- /dev/null
+++ b/lld/test/ELF/sysv-hash-no-rosegment.s
@@ -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
OpenPOWER on IntegriCloud