[PATCH] D27711: ELF/AArch64: Fix dynamic relocation against local symbol in shared objects

Adhemerval Zanella via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 16 04:29:21 PST 2016


zatrazz removed rL LLVM as the repository for this revision.
zatrazz updated this revision to Diff 81737.
zatrazz added a comment.

Updated patch based on previous comments.


https://reviews.llvm.org/D27711

Files:
  ELF/Relocations.cpp
  test/ELF/aarch64-tlsdesc.s


Index: test/ELF/aarch64-tlsdesc.s
===================================================================
--- test/ELF/aarch64-tlsdesc.s
+++ test/ELF/aarch64-tlsdesc.s
@@ -4,21 +4,69 @@
 // RUN: llvm-objdump -d %t.so | FileCheck %s
 // RUN: llvm-readobj -r %t.so | FileCheck --check-prefix=REL %s
 
+	.text
         adrp    x0, :tlsdesc:a
         ldr     x1, [x0, :tlsdesc_lo12:a]
         add     x0, x0, :tlsdesc_lo12:a
         .tlsdesccall a
         blr     x1
 
+// Create relocation against local TLS symbols where linker should
+// create target specific dynamic TLSDESC relocation where addend is
+// the symbol VMA in tls block.
+
 // CHECK:      10000: {{.*}}  adrp    x0, #65536
 // CHECK-NEXT: 10004: {{.*}}  ldr     x1, [x0, #144]
 // CHECK-NEXT: 10008: {{.*}}  add     x0, x0, #144
 // CHECK-NEXT: 1000c: {{.*}}  blr     x1
 
+	adrp	x0, :tlsdesc:local1
+	ldr	x1, [x0, :tlsdesc_lo12:local1]
+	add	x0, x0, :tlsdesc_lo12:local1
+        .tlsdesccall a
+        blr     x1
+
+// CHECK:      10010: {{.*}}  adrp    x0, #65536
+// CHECK-NEXT: 10014: {{.*}}  ldr     x1, [x0, #160]
+// CHECK-NEXT: 10018: {{.*}}  add     x0, x0, #160
+// CHECK-NEXT: 1001c: {{.*}}  blr     x1
+
+	adrp	x0, :tlsdesc:local2
+	ldr	x1, [x0, :tlsdesc_lo12:local2]
+	add	x0, x0, :tlsdesc_lo12:local2
+        .tlsdesccall a
+        blr     x1
+
+// CHECK:      10020: {{.*}}  adrp    x0, #65536
+// CHECK-NEXT: 10024: {{.*}}  ldr     x1, [x0, #176]
+// CHECK-NEXT: 10028: {{.*}}  add     x0, x0, #176
+// CHECK-NEXT: 1002c: {{.*}}  blr     x1
+
+        .section .tbss,"awT", at nobits
+        .type   local1, at object
+        .p2align 2
+local1:
+        .word   0
+        .size   local1, 4
+
+        .type   local2, at object
+        .p2align 3
+local2:
+        .xword  0
+        .size   local2, 8
+
+
+// 0x1000 + 4096 + 160 = 0x20A0
+// 0x1000 + 4096 + 176 = 0x20B0
 // 0x1000 + 4096 + 144 = 0x2090
 
+// R_AARCH64_TLSDESC - 0x0 -> start of tls block
+// R_AARCH64_TLSDESC - 0x8 -> align (sizeof (local1), 8)
+
 // REL:      Relocations [
 // REL-NEXT:   Section (4) .rela.dyn {
+// REL-NEXT:     0x200A0 R_AARCH64_TLSDESC - 0x0
+// REL-NEXT:     0x200B0 R_AARCH64_TLSDESC - 0x8
 // REL-NEXT:     0x20090 R_AARCH64_TLSDESC a 0x0
 // REL-NEXT:   }
 // REL-NEXT: ]
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -154,8 +154,8 @@
       Config->Shared) {
     if (In<ELFT>::Got->addDynTlsEntry(Body)) {
       uintX_t Off = In<ELFT>::Got->getGlobalDynOffset(Body);
-      In<ELFT>::RelaDyn->addReloc(
-          {Target->TlsDescRel, In<ELFT>::Got, Off, false, &Body, 0});
+      In<ELFT>::RelaDyn->addReloc({Target->TlsDescRel, In<ELFT>::Got, Off,
+                                   !Body.isPreemptible(), &Body, 0});
     }
     if (Expr != R_TLSDESC_CALL)
       C.Relocations.push_back({Expr, Type, Offset, Addend, &Body});


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27711.81737.patch
Type: text/x-patch
Size: 2910 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161216/767e6915/attachment.bin>


More information about the llvm-commits mailing list