[PATCH] D25978: [ARM][LLD] Synthetic symbol definitions for ARM static linking
Peter Smith via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 27 03:38:30 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL285279: [ELF] Synthetic symbol definitions for ARM static linking (authored by psmith).
Changed prior to commit:
https://reviews.llvm.org/D25978?vs=75843&id=76001#toc
Repository:
rL LLVM
https://reviews.llvm.org/D25978
Files:
lld/trunk/ELF/Writer.cpp
lld/trunk/test/ELF/arm-static-defines.s
Index: lld/trunk/test/ELF/arm-static-defines.s
===================================================================
--- lld/trunk/test/ELF/arm-static-defines.s
+++ lld/trunk/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: lld/trunk/ELF/Writer.cpp
===================================================================
--- lld/trunk/ELF/Writer.cpp
+++ lld/trunk/ELF/Writer.cpp
@@ -632,10 +632,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.
@@ -967,6 +968,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 (OutputSectionBase<ELFT> *Sec = findSection(".ARM.exidx"))
+ Define("__exidx_start", "__exidx_end", Sec);
}
// 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.76001.patch
Type: text/x-patch
Size: 2963 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161027/30593388/attachment.bin>
More information about the llvm-commits
mailing list