[lld] r249462 - [elf2] Correctly determine if we should ignore missing __tls_get_addr.

Michael J. Spencer via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 6 13:39:10 PDT 2015


Author: mspencer
Date: Tue Oct  6 15:39:09 2015
New Revision: 249462

URL: http://llvm.org/viewvc/llvm-project?rev=249462&view=rev
Log:
[elf2] Correctly determine if we should ignore missing __tls_get_addr.

Modified:
    lld/trunk/ELF/SymbolTable.cpp
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/elf2/tls-static.s

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=249462&r1=249461&r2=249462&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Tue Oct  6 15:39:09 2015
@@ -133,13 +133,6 @@ template <class ELFT> void SymbolTable::
   // Given that the symbol is effectively unused, we just create a dummy
   // hidden one to avoid the undefined symbol error.
   addIgnoredSym<ELFT>("_GLOBAL_OFFSET_TABLE_");
-
-  // __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.
-  if (Config->Static)
-    addIgnoredSym<ELFT>("__tls_get_addr");
 }
 
 template <class ELFT> void SymbolTable::addELFFile(ELFFileBase *File) {

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=249462&r1=249461&r2=249462&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Oct  6 15:39:09 2015
@@ -105,9 +105,10 @@ private:
     return !SymTabSec.getSymTable().getSharedFiles().empty() &&
            !Config->DynamicLinker.empty();
   }
-  bool needsDynamicSections() const {
+  bool isOutputDynamic() const {
     return !SymTabSec.getSymTable().getSharedFiles().empty() || Config->Shared;
   }
+  bool needsDynamicSections() const { return isOutputDynamic(); }
   unsigned getVAStart() const { return Config->Shared ? 0 : VAStart; }
 
   std::unique_ptr<llvm::FileOutputBuffer> Buffer;
@@ -347,6 +348,13 @@ template <class ELFT> void Writer<ELFT>:
   AddStartEnd("__fini_array_start", "__fini_array_end",
               DynamicSec.FiniArraySec);
 
+  // __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.
+  if (!isOutputDynamic())
+    Symtab.addIgnoredSym<ELFT>("__tls_get_addr");
+
   // FIXME: Try to avoid the extra walk over all global symbols.
   std::vector<DefinedCommon<ELFT> *> CommonSymbols;
   for (auto &P : Symtab.getSymbols()) {

Modified: lld/trunk/test/elf2/tls-static.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/tls-static.s?rev=249462&r1=249461&r2=249462&view=diff
==============================================================================
--- lld/trunk/test/elf2/tls-static.s (original)
+++ lld/trunk/test/elf2/tls-static.s Tue Oct  6 15:39:09 2015
@@ -1,8 +1,11 @@
 // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/shared.s -o %tso
 // RUN: lld -flavor gnu2 -static %t -o %tout
+// RUN: lld -flavor gnu2 %t -o %tout
+// RUN: lld -flavor gnu2 -shared %tso -o %tshared
+// RUN: not lld -flavor gnu2 -static %t %tshared -o %tout
 // REQUIRES: x86
 
 .global _start
-.text
 _start:
   call __tls_get_addr




More information about the llvm-commits mailing list