Index: ELF/Symbols.cpp =================================================================== --- ELF/Symbols.cpp +++ ELF/Symbols.cpp @@ -267,13 +267,11 @@ 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; + if (isDefined()) + return ExportDynamic; + // When linking a static executable (emulated by SharedFiles.empty()), weak + // undef symbols can be safely dropped from .dynsym. + return Config->Shared || !isUndefWeak() || !SharedFiles.empty(); } // Print out a log message for --trace-symbol. Index: test/ELF/weak-undef-export.s =================================================================== --- test/ELF/weak-undef-export.s +++ test/ELF/weak-undef-export.s @@ -16,16 +16,12 @@ # CHECK-NEXT: Other: 0 # CHECK-NEXT: Section: Undefined (0x0) # CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: foo -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Weak (0x2) -# CHECK-NEXT: Type: None (0x0) -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: Undefined (0x0) -# CHECK-NEXT: } # CHECK-NEXT: ] + .text + .weak foo + .quad foo + + .data .weak foo .quad foo Index: test/ELF/weak-undef-no-shared-libs.s =================================================================== --- test/ELF/weak-undef-no-shared-libs.s +++ test/ELF/weak-undef-no-shared-libs.s @@ -1,7 +1,9 @@ // REQUIRES: x86 // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +// RUN: ld.lld %t.o -o %t +// RUN: llvm-readobj -dyn-symbols %t | FileCheck %s // RUN: ld.lld -pie %t.o -o %t -// RUN: llvm-readobj -V -dyn-symbols %t | FileCheck %s +// RUN: llvm-readobj -dyn-symbols %t | FileCheck %s .globl _start _start: @@ -10,19 +12,8 @@ .long foo@gotpcrel // Test that an entry for weak undefined symbols is NOT emitted in .dynsym as -// the PIE was not linked with any shared libraries. There are other tests which -// ensure that the weak undefined symbols do get emitted in .dynsym for PIEs -// linked against dynamic libraries. +// the executable was not linked with any shared libraries. There are other +// tests which ensure that the weak undefined symbols do get emitted in .dynsym +// for executables linked against dynamic libraries. - -// CHECK: DynamicSymbols [ -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: -// CHECK-NEXT: Value: 0x0 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local (0x0) -// CHECK-NEXT: Type: None (0x0) -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: Undefined (0x0) -// CHECK-NEXT: } -// CHECK-NEXT: ] +// CHECK-NOT: foo Index: test/ELF/weak-undef-rw.s =================================================================== --- test/ELF/weak-undef-rw.s +++ /dev/null @@ -1,12 +0,0 @@ -# REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -# RUN: ld.lld %t.o -o %t --export-dynamic -# RUN: llvm-readobj -r %t | FileCheck %s - -# CHECK: R_X86_64_64 foobar 0x0 - - .global _start -_start: - .data - .weak foobar - .quad foobar