diff options
-rw-r--r-- | lld/ELF/MarkLive.cpp | 7 | ||||
-rw-r--r-- | lld/test/ELF/gc-sections-shared.s | 34 |
2 files changed, 37 insertions, 4 deletions
diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index a64d3f77af5..b76c8b09c08 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -128,10 +128,9 @@ template <class ELFT> void elf::markLive(SymbolTable<ELFT> *Symtab) { // Preserve externally-visible symbols if the symbols defined by this // file can interrupt other ELF file's symbols at runtime. - if (Config->Shared || Config->ExportDynamic) - for (const Symbol *S : Symtab->getSymbols()) - if (S->includeInDynsym()) - MarkSymbol(S->Body); + for (const Symbol *S : Symtab->getSymbols()) + if (S->includeInDynsym()) + MarkSymbol(S->Body); // Preserve special sections and those which are specified in linker // script KEEP command. diff --git a/lld/test/ELF/gc-sections-shared.s b/lld/test/ELF/gc-sections-shared.s new file mode 100644 index 00000000000..d52eae2177b --- /dev/null +++ b/lld/test/ELF/gc-sections-shared.s @@ -0,0 +1,34 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o +# RUN: ld.lld -shared %t2.o -o %t2.so +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld --gc-sections --export-dynamic-symbol foo -o %t %t.o --as-needed %t2.so +# RUN: llvm-readobj --dynamic-table --dyn-symbols %t | FileCheck %s + +# This test the property that we have a needed line for every undefined. +# It would also be OK to drop bar2 and the need for the .so + + +# CHECK: Name: bar +# CHECK: Name: bar2 +# CHECK: Name: foo +# CHECK: NEEDED SharedLibrary ({{.*}}.so) + + +.section .text.foo, "ax" +.globl foo +foo: +call bar + +.section .text.bar, "ax" +.globl bar +bar: +ret + +.section .text._start, "ax" +.globl _start +_start: +ret + +.section .text.unused, "ax" +call bar2 |