forked from OSchip/llvm-project
[ELF] Don't emit empty PT_LOAD segment
Sometimes the very first PT_LOAD segment, created by lld, can be empty. This happens when (all conditions met): - Linker script is used - First section in ELF image is not RO - Not enough space for program headers. Differential revision: https://reviews.llvm.org/D25330 llvm-svn: 283760
This commit is contained in:
parent
5df547c28e
commit
cd8eaf891a
|
@ -655,6 +655,17 @@ void LinkerScript<ELFT>::assignAddresses(std::vector<PhdrEntry<ELFT>> &Phdrs) {
|
|||
FirstPTLoad->First = Out<ELFT>::ElfHeader;
|
||||
if (!FirstPTLoad->Last)
|
||||
FirstPTLoad->Last = Out<ELFT>::ProgramHeaders;
|
||||
} else if (!FirstPTLoad->First) {
|
||||
// Sometimes the very first PT_LOAD segment can be empty.
|
||||
// This happens if (all conditions met):
|
||||
// - Linker script is used
|
||||
// - First section in ELF image is not RO
|
||||
// - Not enough space for program headers.
|
||||
// The code below removes empty PT_LOAD segment and updates
|
||||
// program headers size.
|
||||
Phdrs.erase(FirstPTLoad);
|
||||
Out<ELFT>::ProgramHeaders->setSize(sizeof(typename ELFT::Phdr) *
|
||||
Phdrs.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
# REQUIRES: x86
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
|
||||
# RUN: echo "SECTIONS { .rw : { *(.rw) } .text : { *(.text) } }" > %t.script
|
||||
# RUN: ld.lld -o %t1 --script %t.script %t
|
||||
# RUN: llvm-objdump -private-headers %t1 | FileCheck %s
|
||||
|
||||
## We expect 2 PT_LOAD segments
|
||||
# CHECK: PHDR
|
||||
# CHECK-NEXT: filesz {{0x[0-9a-f]+}} memsz {{0x[0-9a-f]+}} flags r--
|
||||
# CHECK-NEXT: LOAD
|
||||
# CHECK-NEXT: filesz {{0x[0-9a-f]+}} memsz {{0x[0-9a-f]+}} flags rw-
|
||||
# CHECK-NEXT: LOAD
|
||||
# CHECK-NEXT: filesz {{0x[0-9a-f]+}} memsz {{0x[0-9a-f]+}} flags r-x
|
||||
# CHECK-NEXT: STACK
|
||||
# CHECK-NEXT: filesz
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
jmp _start
|
||||
|
||||
.section .rw, "aw"
|
||||
.quad 0
|
Loading…
Reference in New Issue