[PATCH] D19490: ELF: Teach section GC to also GC shared symbols.

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 26 07:08:55 PDT 2016


So, the fundamental problem had nothing to do with gc-sections.

The problem was that we were setting IsUsedInRegularObj based on
symbols but IsUsed based on relocations. I fixed that by setting
IsUsed based on symbols. That matches what bfd and gold do and is
simpler. IsUsed now just means that one of the symbol in that .so
IsUsedInRegularObj.

With that, the attached patch should fix the problem that is blocking
adding version info, no?

Cheers,
Rafael
-------------- next part --------------
diff --git a/ELF/MarkLive.cpp b/ELF/MarkLive.cpp
index a64d3f7..b76c8b0 100644
--- a/ELF/MarkLive.cpp
+++ b/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/test/ELF/gc-sections-shared.s b/test/ELF/gc-sections-shared.s
new file mode 100644
index 0000000..d52eae2
--- /dev/null
+++ b/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


More information about the llvm-commits mailing list