Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -466,7 +466,7 @@ SmallSet Ret; for (const Elf_Sym &S : File.getGlobalELFSyms()) { if (S.st_shndx == SHN_UNDEF || S.st_shndx == SHN_ABS || - S.st_value != SS.Value) + S.getType() == STT_TLS || S.st_value != SS.Value) continue; StringRef Name = check(S.getName(File.getStringTable())); Symbol *Sym = Symtab->find(Name); Index: test/ELF/Inputs/copy-rel-tls.s =================================================================== --- test/ELF/Inputs/copy-rel-tls.s +++ test/ELF/Inputs/copy-rel-tls.s @@ -0,0 +1,12 @@ +.bss +.global foo +.type foo, @object +.size foo, 4 +foo: + +.section .tbss,"awT",@nobits +.global tfoo +.skip 0x2000 +.type tfoo,@object +.size tfoo, 4 +tfoo: Index: test/ELF/copy-rel-tls.s =================================================================== --- test/ELF/copy-rel-tls.s +++ test/ELF/copy-rel-tls.s @@ -0,0 +1,15 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/copy-rel-tls.s -o %t1.o +// RUN: ld.lld %t1.o -shared -soname t1.so -o %t1.so +// RUN: ld.lld %t.o %t1.so -o %t +// RUN: llvm-nm %t1.so | FileCheck %s +// RUN: llvm-nm %t | FileCheck --check-prefix=TLS %s +// foo and tfoo have the same st_value but we should not copy tfoo. +// CHECK: 2000 B foo +// CHECK: 2000 B tfoo +// TLS-NOT: tfoo + +.global _start +_start: + leaq foo, %rax