[lld] r282279 - [ELF] Resolve weak undefined TLS symbols when no phdr is available.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 23 11:47:51 PDT 2016


Author: davide
Date: Fri Sep 23 13:47:50 2016
New Revision: 282279

URL: http://llvm.org/viewvc/llvm-project?rev=282279&view=rev
Log:
[ELF] Resolve weak undefined TLS symbols when no phdr is available.

If we pass --gc-sections to lld and .tbss is not referenced,
the section is reclaimed and lld doesn't create a TLS program header.
R_TLS tries to access the program header -> lld crashes.
Mimic what bfd/gold do in this case and resolve a weak undefined
TLS symbol to the base of the TLS block, i.e. give it a value of zero.

Differential Revision:  https://reviews.llvm.org/D24832

Added:
    lld/trunk/test/ELF/tls-weak-undef.s
Modified:
    lld/trunk/ELF/InputSection.cpp

Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=282279&r1=282278&r2=282279&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Fri Sep 23 13:47:50 2016
@@ -241,6 +241,14 @@ static typename ELFT::uint getSymVA(uint
   case R_RELAX_TLS_IE_TO_LE:
   case R_RELAX_TLS_GD_TO_LE:
   case R_TLS:
+    // A weak undefined TLS symbol resolves to the base of the TLS
+    // block, i.e. gets a value of zero. If we pass --gc-sections to
+    // lld and .tbss is not referenced, it gets reclaimed and we don't
+    // create a TLS program header. Therefore, we resolve this
+    // statically to zero.
+    if (Body.isTls() && (Body.isLazy() || Body.isUndefined()) &&
+        Body.symbol()->isWeak())
+      return 0;
     if (Target->TcbSize)
       return Body.getVA<ELFT>(A) +
              alignTo(Target->TcbSize, Out<ELFT>::TlsPhdr->p_align);

Added: lld/trunk/test/ELF/tls-weak-undef.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/tls-weak-undef.s?rev=282279&view=auto
==============================================================================
--- lld/trunk/test/ELF/tls-weak-undef.s (added)
+++ lld/trunk/test/ELF/tls-weak-undef.s Fri Sep 23 13:47:50 2016
@@ -0,0 +1,16 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+// RUN: ld.lld %t.o -o %t --gc-sections
+
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux \
+// RUN:   %p/Inputs/tls-in-archive.s -o %t1.o
+// RUN: llvm-ar cru %t.a %t1.o
+// RUN: ld.lld %t.o %t.a -o %t
+
+// Check that lld doesn't crash because we don't reference
+// the TLS phdr when it's not created.
+        .globl  _start
+_start:
+        movq    foo at gottpoff(%rip), %rax
+        .section        .tbss,"awT", at nobits
+        .weak   foo




More information about the llvm-commits mailing list