diff options
-rw-r--r-- | lld/ELF/Symbols.cpp | 5 | ||||
-rw-r--r-- | lld/test/ELF/weak-undef-export.s | 13 |
2 files changed, 16 insertions, 2 deletions
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index cf2d6d0d25d..d3f6cc619ce 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -357,8 +357,9 @@ uint8_t Symbol::computeBinding() const { bool Symbol::includeInDynsym() const { if (computeBinding() == STB_LOCAL) return false; - return ExportDynamic || body()->isShared() || - (body()->isUndefined() && Config->Shared); + if (body()->isUndefined()) + return Config->Shared; + return ExportDynamic || body()->isShared(); } // Print out a log message for --trace-symbol. diff --git a/lld/test/ELF/weak-undef-export.s b/lld/test/ELF/weak-undef-export.s index 14290d1e3e6..6780e31a7bd 100644 --- a/lld/test/ELF/weak-undef-export.s +++ b/lld/test/ELF/weak-undef-export.s @@ -4,6 +4,19 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o # RUN: ld.lld --export-dynamic %t.o -o %t +# RUN: llvm-readobj -dyn-symbols %t | FileCheck %s + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# 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: ] .weak foo .quad foo |