Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -639,8 +639,9 @@ // __tls_get_addr, so it's not defined anywhere. Create a hidden definition // 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::DynSymTab && + // there are no TLS optimizations for these targets. Relocatable output does + // not need that either. + if (!Config->Relocatable && !Out::DynSymTab && (Config->EMachine != EM_MIPS && Config->EMachine != EM_ARM)) Symtab::X->addIgnored("__tls_get_addr"); Index: test/ELF/Inputs/relocatable-tls.s =================================================================== --- test/ELF/Inputs/relocatable-tls.s +++ test/ELF/Inputs/relocatable-tls.s @@ -0,0 +1 @@ +callq __tls_get_addr@PLT Index: test/ELF/relocatable-tls.s =================================================================== --- test/ELF/relocatable-tls.s +++ test/ELF/relocatable-tls.s @@ -0,0 +1,15 @@ +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux \ +# RUN: %S/Inputs/relocatable-tls.s -o %t2.o + +# RUN: ld.lld -r %t2.o -o %t3.r +# RUN: llvm-objdump -t %t3.r | FileCheck --check-prefix=RELOCATABLE %s +# RELOCATABLE: SYMBOL TABLE: +# RELOCATABLE: 0000000000000000 *UND* 00000000 __tls_get_addr + +# RUN: ld.lld -shared %t2.o %t3.r -o %t4.out +# RUN: llvm-objdump -t %t4.out | FileCheck --check-prefix=DSO %s +# DSO: SYMBOL TABLE: +# DSO: 0000000000000000 *UND* 00000000 __tls_get_addr + +callq __tls_get_addr@PLT