[PATCH] D79254: [ELF] Don't advance sh_offset for an empty section whose PT_LOAD is removed (due to p_memsz=0)
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 4 08:33:00 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc49f83b6e9e3: [ELF] Don't advance sh_offset for an empty section whose PT_LOAD is removed… (authored by MaskRay).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D79254/new/
https://reviews.llvm.org/D79254
Files:
lld/ELF/Writer.cpp
lld/test/ELF/linkerscript/at8.test
lld/test/ELF/linkerscript/empty-sections-expressions.test
lld/test/ELF/linkerscript/nobits-offset.s
Index: lld/test/ELF/linkerscript/nobits-offset.s
===================================================================
--- lld/test/ELF/linkerscript/nobits-offset.s
+++ 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 {{$}}
Index: lld/test/ELF/linkerscript/empty-sections-expressions.test
===================================================================
--- lld/test/ELF/linkerscript/empty-sections-expressions.test
+++ 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 {
Index: lld/test/ELF/linkerscript/at8.test
===================================================================
--- lld/test/ELF/linkerscript/at8.test
+++ 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
Index: lld/ELF/Writer.cpp
===================================================================
--- lld/ELF/Writer.cpp
+++ lld/ELF/Writer.cpp
@@ -153,14 +153,23 @@
}
static void removeEmptyPTLoad(std::vector<PhdrEntry *> &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<PhdrEntry *> removed(it, phdrs.end());
+ for (OutputSection *sec : outputSections)
+ if (removed.count(sec->ptLoad))
+ sec->ptLoad = nullptr;
+ phdrs.erase(it, phdrs.end());
}
void copySectionsIntoPartitions() {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79254.261831.patch
Type: text/x-patch
Size: 3710 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200504/534700cf/attachment.bin>
More information about the llvm-commits
mailing list