[PATCH] D34800: [ELF] Remove unused synthetic sections from script commands

Petr Hosek via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 28 18:35:04 PDT 2017


phosek created this revision.
phosek added a project: lld.
Herald added a subscriber: emaste.

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.


Repository:
  rL LLVM

https://reviews.llvm.org/D34800

Files:
  ELF/Writer.cpp
  test/ELF/linkerscript/unused-synthetic.s


Index: test/ELF/linkerscript/unused-synthetic.s
===================================================================
--- /dev/null
+++ test/ELF/linkerscript/unused-synthetic.s
@@ -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
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -1149,8 +1149,17 @@
     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());
+    }
   }
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34800.104577.patch
Type: text/x-patch
Size: 1426 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170629/90af9163/attachment.bin>


More information about the llvm-commits mailing list