diff options
-rw-r--r-- | lld/ELF/Writer.cpp | 14 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/orphan-discard.s | 25 |
2 files changed, 33 insertions, 6 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 8570a807d32..836d36a5149 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1010,11 +1010,14 @@ findOrphanPos(std::vector<BaseCommand *>::iterator B, 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 @@ -1022,8 +1025,7 @@ findOrphanPos(std::vector<BaseCommand *>::iterator B, // 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; diff --git a/lld/test/ELF/linkerscript/orphan-discard.s b/lld/test/ELF/linkerscript/orphan-discard.s new file mode 100644 index 00000000000..6fd6fafcd7f --- /dev/null +++ b/lld/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 |