diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -275,13 +275,13 @@ return false; if (computeBinding() == STB_LOCAL) return false; + // If a PIE binary was not linked against any shared libraries, then we can // safely drop weak undef symbols from .dynsym. if (isUndefWeak() && Config->Pie && SharedFiles.empty()) return false; - if (!isDefined()) - return true; - return ExportDynamic; + + return isUndefined() || isShared() || ExportDynamic; } // Print out a log message for --trace-symbol. diff --git a/lld/test/ELF/lto/common4.ll b/lld/test/ELF/lto/common4.ll new file mode 100644 --- /dev/null +++ b/lld/test/ELF/lto/common4.ll @@ -0,0 +1,16 @@ +; REQUIRES: x86 +; RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux /dev/null -o %t.so.o +; RUN: ld.lld -shared -o %t.so %t.so.o + +; RUN: llvm-as %s -o %t.o +; RUN: ld.lld -o %t.exe -save-temps %t.o %t.so +; RUN: llvm-dis < %t.exe.0.2.internalize.bc | FileCheck %s + +; RUN: ld.lld -pie -o %t.exe -save-temps %t.o %t.so +; RUN: llvm-dis < %t.exe.0.2.internalize.bc | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@a = common dso_local local_unnamed_addr global i32 0, align 4 +; CHECK-DAG: @a = internal global i32 0, align 4