From 1b65ad17254b9934bc299f8c928452fa16efb3d8 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 26 Apr 2016 16:26:45 +0000 Subject: [PATCH] Don't gc symbols that have to go in the dynamic symbol table. We were only doing it for .so and --export-dynamic, but those are not the only ways a symbol ends up in the dynamic symbol table. Problem diagnostic and earlier patch version by Peter Collingbourne. llvm-svn: 267568 --- lld/ELF/MarkLive.cpp | 7 +++---- lld/test/ELF/gc-sections-shared.s | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 lld/test/ELF/gc-sections-shared.s diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index a64d3f77..b76c8b0 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -128,10 +128,9 @@ template void elf::markLive(SymbolTable *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 0000000..d52eae2 --- /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 -- 2.7.4