diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -1190,7 +1190,7 @@ continue; } - if (binding == STB_WEAK) + if (sym.binding == STB_WEAK || binding == STB_WEAK) continue; std::lock_guard lock(mu); ctx.duplicates.push_back({&sym, this, sec, eSym.st_value}); diff --git a/lld/test/ELF/comdat-binding2.s b/lld/test/ELF/comdat-binding2.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/comdat-binding2.s @@ -0,0 +1,42 @@ +# REQUIRES: x86 +## Test we don't report duplicate definition errors when mixing Clang STB_WEAK +## and GCC STB_GNU_UNIQUE symbols. + +# RUN: rm -rf %t && split-file %s %t && cd %t +# RUN: llvm-mc -filetype=obj -triple=x86_64 weak.s -o weak.o +# RUN: llvm-mc -filetype=obj -triple=x86_64 unique.s -o unique.o +# RUN: ld.lld weak.o unique.o -o weak +# RUN: llvm-readelf -s weak | FileCheck %s --check-prefix=WEAK +# RUN: ld.lld unique.o weak.o -o unique +# RUN: llvm-readelf -s unique | FileCheck %s --check-prefix=UNIQUE + +# WEAK: OBJECT WEAK DEFAULT [[#]] _ZN1BIiE1aE +# UNIQUE: OBJECT UNIQUE DEFAULT [[#]] _ZN1BIiE1aE + +#--- weak.s +## Clang + .type _ZN1BIiE1aE,@object + .section .bss._ZN1BIiE1aE,"aGwR",@nobits,_ZN1BIiE1aE,comdat + .weak _ZN1BIiE1aE +_ZN1BIiE1aE: + .zero 4 + + .type _ZGVN1BIiE1aE,@object + .section .bss._ZGVN1BIiE1aE,"aGw",@nobits,_ZN1BIiE1aE,comdat + .weak _ZGVN1BIiE1aE +_ZGVN1BIiE1aE: + .quad 0 + +#--- unique.s +## GCC -fgnu-unique. Note the different group signature for the second group. + .weak _ZN1BIiE1aE + .section .bss._ZN1BIiE1aE,"awG",@nobits,_ZN1BIiE1aE,comdat + .type _ZN1BIiE1aE, @gnu_unique_object +_ZN1BIiE1aE: + .zero 4 + + .weak _ZGVN1BIiE1aE + .section .bss._ZGVN1BIiE1aE,"awG",@nobits,_ZGVN1BIiE1aE,comdat + .type _ZGVN1BIiE1aE, @gnu_unique_object +_ZGVN1BIiE1aE: + .zero 8