[lld] r307037 - [ELF] Remove unused synthetic sections from script commands
Petr Hosek via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 3 08:49:25 PDT 2017
Author: phosek
Date: Mon Jul 3 08:49:25 2017
New Revision: 307037
URL: http://llvm.org/viewvc/llvm-project?rev=307037&view=rev
Log:
[ELF] Remove unused synthetic sections from script commands
Script commands are processed before unused synthetic sections are
removed. Therefore, if a linker script matches one of these sections
it'll get emitted as an empty output section because the logic for
removing unused synthetic sections ignores script commands which
could have already matched and captured one of these sections. This
patch fixes that by also removing the unused synthetic sections from
the script commands.
Differential Revision: https://reviews.llvm.org/D34800
Added:
lld/trunk/test/ELF/linkerscript/unused-synthetic.s
Modified:
lld/trunk/ELF/Writer.cpp
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=307037&r1=307036&r2=307037&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Mon Jul 3 08:49:25 2017
@@ -1149,8 +1149,17 @@ static void removeUnusedSyntheticSection
SS->Live = false;
// If there are no other sections in the output section, remove it from the
// output.
- if (OS->Sections.empty())
+ if (OS->Sections.empty()) {
V.erase(std::find(V.begin(), V.end(), OS));
+ // Also remove script commands matching the output section.
+ auto &Cmds = Script->Opt.Commands;
+ auto I = std::remove_if(Cmds.begin(), Cmds.end(), [&](BaseCommand *Cmd) {
+ if (auto *OSCmd = dyn_cast<OutputSectionCommand>(Cmd))
+ return OSCmd->Sec == OS;
+ return false;
+ });
+ Cmds.erase(I, Cmds.end());
+ }
}
}
Added: lld/trunk/test/ELF/linkerscript/unused-synthetic.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/unused-synthetic.s?rev=307037&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/unused-synthetic.s (added)
+++ lld/trunk/test/ELF/linkerscript/unused-synthetic.s Mon Jul 3 08:49:25 2017
@@ -0,0 +1,18 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: echo "SECTIONS { \
+# RUN: .got : { *(.got) } \
+# RUN: .plt : { *(.plt) } \
+# RUN: .text : { *(.text) } \
+# RUN: }" > %t.script
+# RUN: ld.lld -shared -o %t.so --script %t.script %t.o
+
+# RUN: llvm-objdump -section-headers %t.so | FileCheck %s
+# CHECK-NOT: .got
+# CHECK-NOT: .plt
+# CHECK: .text
+# CHECK-NEXT: .dynsym
+
+.global _start
+_start:
+ nop
More information about the llvm-commits
mailing list