Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -482,6 +482,7 @@ if (Sec->Name == "/DISCARD/") { discard(V); Sec->SectionCommands.clear(); + Sec->SectionIndex = 0; // Not an orphan. continue; } Index: test/ELF/linkerscript/discard-phdr.s =================================================================== --- /dev/null +++ test/ELF/linkerscript/discard-phdr.s @@ -0,0 +1,44 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: echo "PHDRS { \ +# RUN: exec PT_LOAD FLAGS(0x4 | 0x1); \ +# RUN: data PT_LOAD FLAGS(0x4 | 0x2); \ +# RUN: } \ +# RUN: SECTIONS { \ +# RUN: .text : { *(.text) } :exec \ +# RUN: .data : { *(.data) } :data \ +# RUN: .foo : { *(.foo) } \ +# RUN: .bar : { *(.bar) } \ +# RUN: .baz : { *(.baz) } \ +# RUN: /DISCARD/ : { *(.comment) } :NONE \ +# RUN: }" > %t.script +# RUN: ld.lld -o %t --script %t.script %t.o +# RUN: llvm-readelf -S -l %t | FileCheck %s + +## Check that /DISCARD/ does not interfere with the assignment of segments to +## sections. + +# CHECK: Section Headers +# CHECK: .data +# CHECK-NEXT: .foo +# CHECK-NEXT: .bar +# CHECK-NEXT: .baz + +# CHECK: Segment Sections +# CHECK-NEXT: .text +# CHECK-NEXT: .data .foo .bar .baz + +.section .text,"ax" + ret + +.section .data,"aw" + .byte 0 + +.section .foo,"aw" + .byte 0 + +.section .bar,"a" + .byte 0 + +.section .baz,"aw" + .byte 0