diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -714,7 +714,8 @@ } void Symbol::resolveShared(const SharedSymbol &other) { - + if (traced) + printTraceSymbol(&other); if (isCommon()) { // See the comment in resolveCommon() above. if (other.size > cast(this)->size) @@ -725,7 +726,10 @@ // An undefined symbol with non default visibility must be satisfied // in the same DSO. uint8_t bind = binding; + uint8_t trace = traced; + traced = false; replace(other); binding = bind; + traced = trace; } } diff --git a/lld/test/ELF/trace-symbols.s b/lld/test/ELF/trace-symbols.s --- a/lld/test/ELF/trace-symbols.s +++ b/lld/test/ELF/trace-symbols.s @@ -13,6 +13,11 @@ # RUN: rm -f %t2.a # RUN: llvm-ar rcs %t2.a %t2 +# RUN: ld.lld -y foo -shared %t1 %t1.so -o /dev/null | \ +# RUN: FileCheck --check-prefix=PREEMPT %s --implicit-check-not=foo +# PREEMPT: trace-symbols.s.tmp1: definition of foo +# PREEMPT-NEXT: trace-symbols.s.tmp1.so: shared definition of foo + # RUN: ld.lld -y foo -trace-symbol common -trace-symbol=hsymbol \ # RUN: %t %t1 %t2 -o %t3 | FileCheck -check-prefix=OBJECTRFOO %s # OBJECTRFOO: trace-symbols.s.tmp: reference to foo @@ -48,7 +53,7 @@ # FOO_AND_COMMON: trace-symbols.s.tmp1.a: lazy definition of common # RUN: ld.lld -y foo -y common %t %t1.so %t2 -o %t3 | \ -# RUN: FileCheck -check-prefix=SHLIBDCOMMON %s +# RUN: FileCheck -check-prefix=SHLIBDCOMMON %s --implicit-check-not=bar # SHLIBDCOMMON: trace-symbols.s.tmp1.so: shared definition of common # RUN: ld.lld -y foo -y common %t %t2.so %t1.so -o %t3 | \ diff --git a/lld/test/ELF/verneed-shared.s b/lld/test/ELF/verneed-shared.s --- a/lld/test/ELF/verneed-shared.s +++ b/lld/test/ELF/verneed-shared.s @@ -7,6 +7,7 @@ # RUN: FileCheck --check-prefix=TRACE %s --implicit-check-not=f@v1 ## TRACE: {{.*}}.o: definition of f@v1 +## TRACE-NEXT: {{.*}}.so: shared definition of f@v1 # RUN: echo '.symver f,f@v1; .symver g,g@v2; call f; call g' | \ # RUN: llvm-mc -filetype=obj -triple=x86_64 - -o %t1.o