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

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 25 19:13:36 PDT 2016


> The whole point of this change is to make sure we don't have references in
> the dynsym to symbols in unneeded DSOs. This is to avoid the scenario I
> mentioned in D19464 where we were emitting version requirements for DSOs
> that weren't in the needed list.
>
> Filtering the dynsym seemed like the best solution to this problem, as it
> means we don't end up with unnecessary DSO references in the executable that
> were created by unneeded sections.

Would the attached patch have the desired effect? With it we consider
more DSOs needed, but the result should be consistent.

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..cb6348a
--- /dev/null
+++ b/test/ELF/gc-sections-shared.s
@@ -0,0 +1,28 @@
+# 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 %t2.so
+# RUN: llvm-nm -D %t | FileCheck %s
+
+# CHECK: T bar
+# CHECK: U bar2
+# CHECK: T foo
+
+.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