diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -153,14 +153,23 @@ } static void removeEmptyPTLoad(std::vector &phdrs) { - llvm::erase_if(phdrs, [&](const PhdrEntry *p) { - if (p->p_type != PT_LOAD) - return false; - if (!p->firstSec) - return true; - uint64_t size = p->lastSec->addr + p->lastSec->size - p->firstSec->addr; - return size == 0; - }); + auto it = std::stable_partition( + phdrs.begin(), phdrs.end(), [&](const PhdrEntry *p) { + if (p->p_type != PT_LOAD) + return true; + if (!p->firstSec) + return false; + uint64_t size = p->lastSec->addr + p->lastSec->size - p->firstSec->addr; + return size != 0; + }); + + // Clear OutputSection::ptLoad for sections contained in removed + // segments. + DenseSet removed(it, phdrs.end()); + for (OutputSection *sec : outputSections) + if (removed.count(sec->ptLoad)) + sec->ptLoad = nullptr; + phdrs.erase(it, phdrs.end()); } void copySectionsIntoPartitions() { diff --git a/lld/test/ELF/linkerscript/at8.test b/lld/test/ELF/linkerscript/at8.test --- a/lld/test/ELF/linkerscript/at8.test +++ b/lld/test/ELF/linkerscript/at8.test @@ -20,7 +20,7 @@ # PT_LOAD header. # CHECK: Name Type Address Off -# CHECK: .text PROGBITS 0000000008000000 001000 +# CHECK: .text PROGBITS 0000000008000000 000158 # CHECK: .sec1 PROGBITS 0000000020000000 001000 # CHECK: .sec2 PROGBITS 0000000020000008 001008 # CHECK: .sec3 PROGBITS 0000000020000010 001010 diff --git a/lld/test/ELF/linkerscript/empty-sections-expressions.test b/lld/test/ELF/linkerscript/empty-sections-expressions.test --- a/lld/test/ELF/linkerscript/empty-sections-expressions.test +++ b/lld/test/ELF/linkerscript/empty-sections-expressions.test @@ -9,7 +9,7 @@ # CHECK: Name Type Address Off Size # CHECK-NEXT: NULL 0000000000000000 000000 000000 -# CHECK-NEXT: .empty PROGBITS 0000000000080000 001000 000000 +# CHECK-NEXT: .empty PROGBITS 0000000000080000 000158 000000 # CHECK-NEXT: .text PROGBITS 0000000000080000 001000 000001 # CHECK-NEXT: .data PROGBITS 0000000000080001 001001 000001 @@ -19,7 +19,7 @@ # CHECK-NEXT: LOAD 0x001001 0x0000000000080001 0x0000000000082000 # CHECK: Section to Segment mapping: -# CHECK: 00 .empty .text {{$}} +# CHECK: 00 .text {{$}} # CHECK-NEXT: 01 .data {{$}} SECTIONS { diff --git a/lld/test/ELF/linkerscript/nobits-offset.s b/lld/test/ELF/linkerscript/nobits-offset.s --- a/lld/test/ELF/linkerscript/nobits-offset.s +++ b/lld/test/ELF/linkerscript/nobits-offset.s @@ -14,12 +14,12 @@ # CHECK: Name Type Address Off Size # CHECK-NEXT: NULL 0000000000000000 000000 000000 -# CHECK-NEXT: .text PROGBITS 0000000000000000 001000 000000 -# CHECK-NEXT: .sec1 NOBITS 0000000000000000 001000 000001 -# CHECK-NEXT: .bss NOBITS 0000000000000400 001400 000001 +# CHECK-NEXT: .text PROGBITS 0000000000000000 000158 000000 +# CHECK-NEXT: .sec1 NOBITS 0000000000000000 000158 000001 +# CHECK-NEXT: .bss NOBITS 0000000000000400 000400 000001 # CHECK: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align -# CHECK-NEXT: LOAD 0x001400 0x0000000000000400 0x0000000000000400 0x000000 0x000001 RW 0x1000 +# CHECK-NEXT: LOAD 0x000400 0x0000000000000400 0x0000000000000400 0x000000 0x000001 RW 0x1000 # CHECK: 00 .bss {{$}}