[PATCH] D93257: [lld-macho] Don't emit rebase opcodes for relocs in TLV sections

Jez Ng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 15 13:00:37 PST 2020


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG318451990944: [lld-macho] Don't emit rebase opcodes for relocs in TLV sections (authored by int3).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D93257/new/

https://reviews.llvm.org/D93257

Files:
  lld/MachO/Arch/X86_64.cpp
  lld/test/MachO/tlv-dylib.s
  lld/test/MachO/tlv.s


Index: lld/test/MachO/tlv.s
===================================================================
--- lld/test/MachO/tlv.s
+++ lld/test/MachO/tlv.s
@@ -1,9 +1,14 @@
 # REQUIRES: x86
 # RUN: mkdir -p %t
 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/test.o
+
 # RUN: %lld -lSystem -o %t/test %t/test.o
 # RUN: llvm-readobj --file-headers %t/test | FileCheck %s --check-prefix=HEADER
-# RUN: llvm-objdump -D %t/test | FileCheck %s
+# RUN: llvm-objdump -D --bind --rebase %t/test | FileCheck %s
+
+# RUN: %lld -lSystem -pie -o %t/test %t/test.o
+# RUN: llvm-readobj --file-headers %t/test | FileCheck %s --check-prefix=HEADER
+# RUN: llvm-objdump -D --bind --rebase %t/test | FileCheck %s
 
 # HEADER: MH_HAS_TLV_DESCRIPTORS
 
@@ -36,6 +41,13 @@
 # CHECK-NEXT:  00 00
 # CHECK-NEXT:  00 00
 
+## Make sure we don't emit rebase opcodes for relocations in __thread_vars.
+# CHECK:       Rebase table:
+# CHECK-NEXT:  segment  section            address     type
+# CHECK-NEXT:  Bind table:
+# CHECK:       __DATA  __thread_vars   0x{{[0-9a-f]*}}  pointer 0 libSystem __tlv_bootstrap
+# CHECK:       __DATA  __thread_vars   0x{{[0-9a-f]*}}  pointer 0 libSystem __tlv_bootstrap
+
 .globl _main
 _main:
   mov _foo at TLVP(%rip), %rax
Index: lld/test/MachO/tlv-dylib.s
===================================================================
--- lld/test/MachO/tlv-dylib.s
+++ lld/test/MachO/tlv-dylib.s
@@ -4,9 +4,14 @@
 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libtlv.s -o %t/libtlv.o
 # RUN: %lld -dylib -install_name @executable_path/libtlv.dylib \
 # RUN:   -lSystem -o %t/libtlv.dylib %t/libtlv.o
-# RUN: llvm-objdump --exports-trie -d --no-show-raw-insn %t/libtlv.dylib | FileCheck %s --check-prefix=DYLIB
+# RUN: llvm-objdump --macho --exports-trie --rebase %t/libtlv.dylib | \
+# RUN:   FileCheck %s --check-prefix=DYLIB
 # DYLIB-DAG: _foo [per-thread]
 # DYLIB-DAG: _bar [per-thread]
+## Make sure we don't emit rebase opcodes for relocations in __thread_vars.
+# DYLIB:       Rebase table:
+# DYLIB-NEXT:  segment  section            address     type
+# DYLIB-EMPTY:
 
 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
 # RUN: %lld -lSystem -L%t -ltlv %t/test.o -o %t/test
Index: lld/MachO/Arch/X86_64.cpp
===================================================================
--- lld/MachO/Arch/X86_64.cpp
+++ lld/MachO/Arch/X86_64.cpp
@@ -248,7 +248,11 @@
         return;
       }
     }
-    addNonLazyBindingEntries(sym, isec, r.offset, r.addend);
+    // References from thread-local variable sections are treated as offsets
+    // relative to the start of the referent section, and therefore have no
+    // need of rebase opcodes.
+    if (!(isThreadLocalVariables(isec->flags) && isa<Defined>(sym)))
+      addNonLazyBindingEntries(sym, isec, r.offset, r.addend);
     break;
   }
   case X86_64_RELOC_SIGNED:


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D93257.312007.patch
Type: text/x-patch
Size: 2880 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201215/996993a9/attachment.bin>


More information about the llvm-commits mailing list