diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-11-16 18:01:41 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-11-16 18:01:41 +0000 |
commit | 95eae57d7887777cd41e6f86b88a1d12bb8cc259 (patch) | |
tree | a1218cad3c7046acc6fc393dd7775f119e72099c | |
parent | e0fc24210dbf23368fd61bb3d904b0bb74a0cb9d (diff) | |
download | llvm-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.cpp | 3 | ||||
-rw-r--r-- | lld/test/ELF/defined-tls_get_addr.s | 10 |
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 |