aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-11-16 18:01:41 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-11-16 18:01:41 +0000
commit95eae57d7887777cd41e6f86b88a1d12bb8cc259 (patch)
treea1218cad3c7046acc6fc393dd7775f119e72099c
parente0fc24210dbf23368fd61bb3d904b0bb74a0cb9d (diff)
downloadllvm-95eae57d7887777cd41e6f86b88a1d12bb8cc259.zip
llvm-95eae57d7887777cd41e6f86b88a1d12bb8cc259.tar.gz
llvm-95eae57d7887777cd41e6f86b88a1d12bb8cc259.tar.bz2
Don't error if __tls_get_addr is defined.
Turns out some systems do define it. Not producing an error in this case matches gold and bfd. llvm-svn: 287125
-rw-r--r--lld/ELF/SymbolTable.cpp3
-rw-r--r--lld/test/ELF/defined-tls_get_addr.s10
2 files changed, 12 insertions, 1 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 9f11d4c..8e0c4f9 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -137,7 +137,8 @@ DefinedRegular<ELFT> *SymbolTable<ELFT>::addAbsolute(StringRef Name,
template <class ELFT>
DefinedRegular<ELFT> *SymbolTable<ELFT>::addIgnored(StringRef Name,
uint8_t Visibility) {
- if (!find(Name))
+ SymbolBody *S = find(Name);
+ if (!S || !S->isUndefined())
return nullptr;
return addAbsolute(Name, Visibility);
}
diff --git a/lld/test/ELF/defined-tls_get_addr.s b/lld/test/ELF/defined-tls_get_addr.s
new file mode 100644
index 0000000..509c293
--- /dev/null
+++ b/lld/test/ELF/defined-tls_get_addr.s
@@ -0,0 +1,10 @@
+// RUN: llvm-mc %s -o %t.o -triple x86_64-pc-linux -filetype=obj
+// RUN: ld.lld %t.o -o %t
+
+// Don't error if __tls_get_addr is defined.
+
+.global _start
+.global __tls_get_addr
+_start:
+__tls_get_addr:
+nop