Linker script: fix crash when discarding section
authorEugene Leviant <evgeny.leviant@gmail.com>
Fri, 23 Sep 2016 13:17:16 +0000 (13:17 +0000)
committerEugene Leviant <evgeny.leviant@gmail.com>
Fri, 23 Sep 2016 13:17:16 +0000 (13:17 +0000)
If section contains local symbols ldd crashes, because local
symbols are added to symbol table before section is discarded
by linker script processor. This patch calls copyLocalSymbols()
after createSections, so discarded section symbols are not copied

llvm-svn: 282244

lld/ELF/Writer.cpp
lld/test/ELF/linkerscript/discard-section.s [new file with mode: 0644]

index e42240f..5ab9d64 100644 (file)
@@ -244,8 +244,6 @@ template <class ELFT> static std::vector<DefinedCommon *> getCommonSymbols() {
 
 // The main function of the writer.
 template <class ELFT> void Writer<ELFT>::run() {
-  if (Config->Discard != DiscardPolicy::All)
-    copyLocalSymbols();
   addReservedSymbols();
 
   if (Target->NeedsThunks)
@@ -262,6 +260,9 @@ template <class ELFT> void Writer<ELFT>::run() {
     Script<ELFT>::X->processCommands(Factory);
   }
 
+  if (Config->Discard != DiscardPolicy::All)
+    copyLocalSymbols();
+
   finalizeSections();
   if (HasError)
     return;
diff --git a/lld/test/ELF/linkerscript/discard-section.s b/lld/test/ELF/linkerscript/discard-section.s
new file mode 100644 (file)
index 0000000..d7d2acf
--- /dev/null
@@ -0,0 +1,10 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: echo "SECTIONS { /DISCARD/ : { *(.aaa*) } }" > %t.script
+# RUN: ld.lld -o %t1 --script %t.script %t
+# RUN: llvm-objdump -section-headers %t1 | FileCheck %s
+# CHECK-NOT: .aaa
+
+.section .aaa,"a"
+aaa:
+  .quad 0