[PATCH] D56666: [LLD][ELF][AArch64] Add missing PLT relocations to isStaticLinkTimeConstant

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 14 07:51:10 PST 2019


peter.smith created this revision.
peter.smith added reviewers: ruiu, grimar.
Herald added subscribers: kristof.beyls, arichardson, javed.absar, emaste.
Herald added a reviewer: espindola.

D54314 <https://reviews.llvm.org/D54314> fixed pr38074 for AArch64 for static linking. It added two new RelExpr instances R_AARCH64_GOT_PAGE_PC_PLT and R_GOT_PLT. These need to be added to isStaticLinkTimeConstant so that the address of an ifunc can be taken when building a shared library. I've checked that both ld.gold and ld.bfd generate the same PLT and relocations for this case.

Fixes pr40250 (https://bugs.llvm.org/show_bug.cgi?id=40250) which is a regression introduced by D54314 <https://reviews.llvm.org/D54314>.

While looking into this I think LLD isn't getting PIE or non-preemptible ifuncs right (and wasn't prior to D54314 <https://reviews.llvm.org/D54314>). The got entry generated as a result of the got generating relocation pair above is reduced to a R_AARCH64_RELATIVE to the ifunc resolver.  I'm working on a proper fix for this but as it is not a regression I think it can go in a separate patch.


https://reviews.llvm.org/D56666

Files:
  ELF/Relocations.cpp
  test/ELF/aarch64-gnu-ifunc-address.s


Index: test/ELF/aarch64-gnu-ifunc-address.s
===================================================================
--- /dev/null
+++ test/ELF/aarch64-gnu-ifunc-address.s
@@ -0,0 +1,40 @@
+# REQUIRES: aarch64
+# RUN: llvm-mc -filetype=obj -triple=aarch64-none-linux-gnu %s -o %t.o
+# RUN: ld.lld -shared %t.o -o %tout
+# RUN: llvm-objdump -D %tout | FileCheck %s
+# RUN: llvm-readobj -r %tout | FileCheck %s --check-prefix=CHECK-RELOCS
+
+# Test that when we take the address of a preemptible ifunc in a shared object
+# we get R_AARCH64_GLOB_DAT to the symbol as it could be defined in another
+# link unit and preempt our definition.
+.text
+.globl myfunc
+.type myfunc, at gnu_indirect_function
+myfunc:
+ ret
+
+.text
+.globl main
+.type main, at function
+main:
+ adrp x8, :got:myfunc
+ ldr  x8, [x8, :got_lo12:myfunc]
+ ret
+# CHECK:   0000000000010004 main:
+# x8 = 0x30000
+# CHECK-NEXT:    10004: 08 01 00 90     adrp    x8, #131072
+# x8 = 0x300e0 = .got entry for myfunc with R_AARCH64_GLOB_DAT
+# CHECK-NEXT:    10008: 08 71 40 f9     ldr     x8, [x8, #224]
+# CHECK-NEXT:    1000c: c0 03 5f d6     ret
+
+# CHECK: Disassembly of section .got:
+# CHECK-NEXT: 00000000000300e0 .got:
+
+# CHECK-RELOCS: Relocations [
+# CHECK-RELOCS-NEXT:   Section {{.*}} .rela.dyn {
+# CHECK-RELOCS-NEXT:     0x300E0 R_AARCH64_GLOB_DAT myfunc 0x0
+# CHECK-RELOCS-NEXT:   }
+# CHECK-RELOCS-NEXT:   Section {{.*}} .rela.plt {
+# CHECK-RELOCS-NEXT:     0x20018 R_AARCH64_JUMP_SLOT myfunc 0x0
+# CHECK-RELOCS-NEXT:   }
+# CHECK-RELOCS-NEXT: ]
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -374,8 +374,8 @@
   if (isRelExprOneOf<R_GOT_FROM_END, R_GOT_OFF, R_HEXAGON_GOT, R_TLSLD_GOT_OFF,
                      R_MIPS_GOT_LOCAL_PAGE, R_MIPS_GOTREL, R_MIPS_GOT_OFF,
                      R_MIPS_GOT_OFF32, R_MIPS_GOT_GP_PC, R_MIPS_TLSGD,
-                     R_AARCH64_GOT_PAGE_PC, R_GOT_PC, R_GOTONLY_PC,
-                     R_GOTONLY_PC_FROM_END, R_PLT_PC, R_TLSGD_GOT,
+                     R_AARCH64_GOT_PAGE_PC, R_AARCH64_GOT_PAGE_PC_PLT, R_GOT_PC,
+                     R_GOTONLY_PC, R_GOTONLY_PC_FROM_END, R_PLT_PC, R_TLSGD_GOT,
                      R_TLSGD_GOT_FROM_END, R_TLSGD_PC, R_PPC_CALL_PLT,
                      R_TLSDESC_CALL, R_AARCH64_TLSDESC_PAGE, R_HINT,
                      R_TLSLD_HINT, R_TLSIE_HINT>(E))
@@ -383,7 +383,7 @@
 
   // These never do, except if the entire file is position dependent or if
   // only the low bits are used.
-  if (E == R_GOT || E == R_PLT || E == R_TLSDESC)
+  if (E == R_GOT || E == R_GOT_PLT || E == R_PLT || E == R_TLSDESC)
     return Target->usesOnlyLowPageBits(Type) || !Config->Pic;
 
   if (Sym.IsPreemptible)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56666.181559.patch
Type: text/x-patch
Size: 2756 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190114/c88ef7e8/attachment.bin>


More information about the llvm-commits mailing list