[PATCH] D39172: [ELF] When placing orphans, handle case when last section is dead

Petr Hosek via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 22 17:51:48 PDT 2017


phosek updated this revision to Diff 119804.
phosek marked an inline comment as done.
phosek edited the summary of this revision.

Repository:
  rL LLVM

https://reviews.llvm.org/D39172

Files:
  ELF/Writer.cpp
  test/ELF/linkerscript/orphan-discard.s


Index: test/ELF/linkerscript/orphan-discard.s
===================================================================
--- /dev/null
+++ test/ELF/linkerscript/orphan-discard.s
@@ -0,0 +1,25 @@
+# REQUIRES: x86
+# RUN: llvm-mc -position-independent -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: echo "SECTIONS { \
+# RUN:  . = 0xffffffff80000000; \
+# RUN:  .text : ALIGN(4096) { *(.text) } \
+# RUN:  .data : ALIGN(4096) { *(.data) } \
+# RUN:  .bss : ALIGN(4096) { *(.bss); } \
+# RUN:  . = ALIGN(4096); \
+# RUN:  _end = .; \
+# RUN:  /DISCARD/ : { *(.comment) } \
+# RUN: }" > %t.script
+# RUN: ld.lld -o %t --script %t.script %t.o
+# RUN: llvm-readelf -s -symbols %t | FileCheck %s
+
+# CHECK: .bss NOBITS ffffffff80002000 002008 000002 00 WA 0 0 4096
+# CHECK: ffffffff80003000 0 NOTYPE GLOBAL DEFAULT 3 _end
+
+.section .text, "ax"
+  ret
+
+.section .data, "aw"
+  .quad 0
+
+.section .bss, "", @nobits
+  .short 0
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -1010,20 +1010,22 @@
         Sec->SortRank < CurSec->SortRank)
       break;
   }
+
+  auto IsLiveSection = [](BaseCommand *Cmd) {
+    auto *OS = dyn_cast<OutputSection>(Cmd);
+    return OS && OS->Live;
+  };
+
   auto J = std::find_if(llvm::make_reverse_iterator(I),
-                        llvm::make_reverse_iterator(B), [](BaseCommand *Cmd) {
-                          auto *OS = dyn_cast<OutputSection>(Cmd);
-                          return OS && OS->Live;
-                        });
+                        llvm::make_reverse_iterator(B), IsLiveSection);
   I = J.base();
 
   // As a special case, if the orphan section is the last section, put
   // it at the very end, past any other commands.
   // This matches bfd's behavior and is convenient when the linker script fully
   // specifies the start of the file, but doesn't care about the end (the non
   // alloc sections for example).
-  auto NextSec = std::find_if(
-      I, E, [](BaseCommand *Cmd) { return isa<OutputSection>(Cmd); });
+  auto NextSec = std::find_if(I, E, IsLiveSection);
   if (NextSec == E)
     return E;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39172.119804.patch
Type: text/x-patch
Size: 2167 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171023/839c5167/attachment.bin>


More information about the llvm-commits mailing list