From d4dea164dd453f567d9d33f3c158c33d6904987f Mon Sep 17 00:00:00 2001 From: Eugene Leviant Date: Fri, 23 Sep 2016 13:17:16 +0000 Subject: [PATCH] Linker script: fix crash when discarding section 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 | 5 +++-- lld/test/ELF/linkerscript/discard-section.s | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 lld/test/ELF/linkerscript/discard-section.s diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index e42240fdd830..5ab9d64e1160 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -244,8 +244,6 @@ template static std::vector getCommonSymbols() { // The main function of the writer. template void Writer::run() { - if (Config->Discard != DiscardPolicy::All) - copyLocalSymbols(); addReservedSymbols(); if (Target->NeedsThunks) @@ -262,6 +260,9 @@ template void Writer::run() { Script::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 index 000000000000..d7d2acff1b47 --- /dev/null +++ b/lld/test/ELF/linkerscript/discard-section.s @@ -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