summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Schouten <ed@nuxi.nl>2016-04-05 20:17:33 +0000
committerEd Schouten <ed@nuxi.nl>2016-04-05 20:17:33 +0000
commitf2fdd013a29b26791490e3a33beda1bacfeec182 (patch)
tree5cc67b915027ef65e09dd46f1541a60e12233e5d
parent60fbd3bdb78c0b220f63fa886c877ac7adc6bca7 (diff)
downloadbcm5719-llvm-f2fdd013a29b26791490e3a33beda1bacfeec182.tar.gz
bcm5719-llvm-f2fdd013a29b26791490e3a33beda1bacfeec182.zip
Don't omit dynamic relocations for the GOT.
Where Clang's AArch64 backend seems to differ from the X86 backend is that it tends to use the GOT more aggressively. After getting CloudABI PIEs working on x86-64, I noticed that accessing global variables would still crash on aarch64. Tracing it down, it turns out that the GOT was filled with entries assuming the base address was zero. It turns out that we skip generating relocations for GOT entries in case the relocation pointing towards the GOT is relative. Whether the thing pointing to the GOT is absolute or relative shouldn't make any difference; the GOT entry itself should contain the absolute address, thus needs a relocation regardless. Approved by: rafael Differential Revision: http://reviews.llvm.org/D18739 llvm-svn: 265453
-rw-r--r--lld/ELF/Writer.cpp4
-rw-r--r--lld/test/ELF/aarch64-got-relocations.s21
2 files changed, 22 insertions, 3 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index e6806c79697..f0ad5f6b115 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -432,9 +432,7 @@ void Writer<ELFT>::scanRelocs(InputSectionBase<ELFT> &C, ArrayRef<RelTy> Rels) {
// ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
continue;
- bool Dynrel = Config->Pic && !Target->isRelRelative(Type) &&
- !Target->isSizeRel(Type);
- if (Preemptible || Dynrel) {
+ if (Preemptible || Config->Pic) {
uint32_t DynType;
if (Body.isTls())
DynType = Target->TlsGotRel;
diff --git a/lld/test/ELF/aarch64-got-relocations.s b/lld/test/ELF/aarch64-got-relocations.s
new file mode 100644
index 00000000000..13ee09a892e
--- /dev/null
+++ b/lld/test/ELF/aarch64-got-relocations.s
@@ -0,0 +1,21 @@
+# REQUIRES: aarch64
+# RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-cloudabi %s -o %t.o
+# RUN: ld.lld -pie %t.o -o %t
+# RUN: llvm-readobj -r %t | FileCheck %s
+
+# If we're addressing a global relatively through the GOT, we still need to
+# emit a relocation for the entry in the GOT itself.
+# CHECK: Relocations [
+# CHECK: Section (4) .rela.dyn {
+# CHECK: 0x{{[0-9A-F]+}} R_AARCH64_RELATIVE - 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ]
+
+ .globl _start
+ .type _start,@function
+_start:
+ adrp x8, :got:i
+ ldr x8, [x8, :got_lo12:i]
+
+ .type i,@object
+ .comm i,4,4
OpenPOWER on IntegriCloud