diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index a9e3645043fe0..f0f6121009a53 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -277,8 +277,10 @@ bool Symbol::includeInDynsym() const { return false; if (computeBinding() == STB_LOCAL) return false; + if (!isDefined() && !isCommon()) + return true; - return isUndefined() || isShared() || exportDynamic || inDynamicList; + return exportDynamic || inDynamicList; } // Print out a log message for --trace-symbol. diff --git a/lld/test/ELF/weak-undef-lib.s b/lld/test/ELF/weak-undef-lib.s index 0b4183e80e52e..54e05dc7e9877 100644 --- a/lld/test/ELF/weak-undef-lib.s +++ b/lld/test/ELF/weak-undef-lib.s @@ -6,6 +6,9 @@ # RUN: ld.lld -shared -o %t.so %t1.o --start-lib %t2.o # RUN: llvm-readobj --dyn-syms %t.so | FileCheck %s +# RUN: ld.lld -pie -o %t %t1.o --start-lib %t2.o +# RUN: llvm-readobj --dyn-syms %t | FileCheck %s + # CHECK: Name: foo # CHECK-NEXT: Value: 0x0 # CHECK-NEXT: Size: 0 @@ -15,5 +18,7 @@ # CHECK-NEXT: Section: Undefined .weak foo +call foo@PLT + .data .quad foo