[PATCH] D25978: [ARM][LLD] Synthetic symbol definitions for ARM static linking

Peter Smith via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 26 03:58:35 PDT 2016


peter.smith created this revision.
peter.smith added reviewers: ruiu, rafael.
peter.smith added a subscriber: llvm-commits.
Herald added subscribers: rengolin, aemerson.

When static linking in ARM (like Mips) __tls_get_addr is defined by the library so we should not define it as a synthetic.

      

We also need to add __exidx_start and __exidx_end for the .ARM.exidx section as the static libc library startup code is expecting them to be defined by the default linker script for static linking on ARM when GNU ld is used.

Extract from arm-linux-gnueabihf-ld --static --verbose
`   PROVIDE_HIDDEN (__exidx_start = .);`
` .ARM.exidx   : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }`
`  PROVIDE_HIDDEN (__exidx_end = .);`

There is still more work to do for static linking to work on ARM, there are problems with ifunc, TLS and unresolved weak references. I have patches ready for most of these.


https://reviews.llvm.org/D25978

Files:
  ELF/Writer.cpp
  test/ELF/arm-static-defines.s


Index: test/ELF/arm-static-defines.s
===================================================================
--- /dev/null
+++ test/ELF/arm-static-defines.s
@@ -0,0 +1,44 @@
+// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t
+// RUN: ld.lld %t --static -o %t2 2>&1
+// RUN: llvm-readobj --symbols %t2 | FileCheck %s
+// REQUIRES: arm
+
+// Check that on ARM we don't get a multiply defined symbol for __tls_get_addr
+// and undefined symbols for references to __exidx_start and __exidx_end
+ .syntax unified
+.section .text
+ .global __tls_get_addr
+__tls_get_addr:
+ bx lr
+
+ .global _start
+ .global __exidx_start
+ .global __exidx_end
+_start:
+ .fnstart
+ bx lr
+ .word __exidx_start
+ .word __exidx_end
+ .cantunwind
+ .fnend
+
+// CHECK:          Name: __exidx_end
+// CHECK-NEXT:     Value: 0x100DC
+// CHECK-NEXT:     Size: 0
+// CHECK-NEXT:     Binding: Local
+// CHECK-NEXT:     Type: None
+// CHECK-NEXT:     Other [
+// CHECK-NEXT:       STV_HIDDEN
+// CHECK-NEXT:     ]
+// CHECK-NEXT:     Section: .ARM.exidx
+// CHECK:          Name: __exidx_start
+// CHECK-NEXT:     Value: 0x100D4
+// CHECK-NEXT:     Size: 0
+// CHECK-NEXT:     Binding: Local
+// CHECK-NEXT:     Type: None
+// CHECK-NEXT:     Other [
+// CHECK-NEXT:       STV_HIDDEN
+// CHECK-NEXT:     ]
+// CHECK-NEXT:   Section: .ARM.exidx
+// CHECK:          Symbol {
+// CHECK-NEXT:     Name: __tls_get_addr
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -620,10 +620,11 @@
   // __tls_get_addr is defined by the dynamic linker for dynamic ELFs. For
   // static linking the linker is required to optimize away any references to
   // __tls_get_addr, so it's not defined anywhere. Create a hidden definition
-  // to avoid the undefined symbol error. As usual as special case is MIPS -
-  // MIPS libc defines __tls_get_addr itself because there are no TLS
-  // optimizations for this target.
-  if (!Out<ELFT>::DynSymTab && Config->EMachine != EM_MIPS)
+  // to avoid the undefined symbol error. As usual special cases are ARM and
+  // MIPS - the libc for these targets defines __tls_get_addr itself because
+  // there are no TLS optimizations for these targets.
+  if (!Out<ELFT>::DynSymTab &&
+      (Config->EMachine != EM_MIPS && Config->EMachine != EM_ARM))
     Symtab<ELFT>::X->addIgnored("__tls_get_addr");
 
   // If linker script do layout we do not need to create any standart symbols.
@@ -955,6 +956,9 @@
          Out<ELFT>::PreinitArray);
   Define("__init_array_start", "__init_array_end", Out<ELFT>::InitArray);
   Define("__fini_array_start", "__fini_array_end", Out<ELFT>::FiniArray);
+
+  if (Config->EMachine == EM_ARM)
+    Define("__exidx_start", "__exidx_end", findSection(".ARM.exidx"));
 }
 
 // If a section name is valid as a C identifier (which is rare because of


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25978.75843.patch
Type: text/x-patch
Size: 2875 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161026/6033c8c6/attachment.bin>


More information about the llvm-commits mailing list