Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[llvm-objcopy] Fix handling of zero-size segments in llvm-objcopy
Some ELF files produced by lld may have zero-size segment placeholders as shown below. Since GNU_STACK Offset is 0, the current code makes it the lowest used offset, and relocates all the segments over the ELF header. The resulting binary is total garbage. This change fixes how llvm-objcopy handles PT_PHDR properlly by treating ELF headers and the program header table as segments to allow the layout algorithm decide where those should go. Author: vit9696 Differential Revision: https://reviews.llvm.org/D42872 llvm-svn: 325189
- Loading branch information
1 parent
1e368d1
commit 6452b11
Showing
3 changed files
with
181 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
# RUN: yaml2obj %s -o %t | ||
# RUN: llvm-objcopy %t %t2 | ||
# RUN: llvm-readobj -program-headers %t2 | FileCheck %s | ||
|
||
!ELF | ||
FileHeader: | ||
Class: ELFCLASS32 | ||
Data: ELFDATA2LSB | ||
Type: ET_EXEC | ||
Machine: EM_ARM | ||
Sections: | ||
- Name: .text | ||
Type: SHT_PROGBITS | ||
Flags: [ SHF_ALLOC, SHF_EXECINSTR ] | ||
Address: 0x1000 | ||
AddressAlign: 0x0000000000001000 | ||
Content: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" | ||
- Name: .data | ||
Type: SHT_PROGBITS | ||
Flags: [ SHF_ALLOC ] | ||
Address: 0x2000 | ||
AddressAlign: 0x0000000000001000 | ||
Content: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" | ||
- Name: .xdata | ||
Type: SHT_PROGBITS | ||
Flags: [ SHF_ALLOC ] | ||
- Name: .after | ||
Type: SHT_NOBITS | ||
Flags: [ SHF_ALLOC ] | ||
Size: 64 | ||
ProgramHeaders: | ||
- Type: PT_LOAD | ||
Flags: [ PF_X, PF_R ] | ||
VAddr: 0x1000 | ||
PAddr: 0x1000 | ||
Align: 0x1000 | ||
Sections: | ||
- Section: .text | ||
- Type: PT_LOAD | ||
Flags: [ PF_R, PF_W ] | ||
VAddr: 0x2000 | ||
PAddr: 0x2000 | ||
Align: 0x1000 | ||
Sections: | ||
- Section: .data | ||
- Type: 0x6474e551 # GNU_STACK | ||
Flags: [ PF_R, PF_W ] | ||
VAddr: 0x0000 | ||
PAddr: 0x0000 | ||
Align: 0x0000 | ||
- Type: PT_LOAD | ||
Flags: [ PF_R ] | ||
VAddr: 0x2010 | ||
PAddr: 0x2010 | ||
Sections: | ||
- Section: .xdata | ||
- Section: .after | ||
|
||
#CHECK: ProgramHeaders [ | ||
#CHECK-NEXT: ProgramHeader { | ||
#CHECK-NEXT: Type: PT_LOAD | ||
#CHECK-NEXT: Offset: 0x1000 | ||
#CHECK-NEXT: VirtualAddress: 0x1000 | ||
#CHECK-NEXT: PhysicalAddress: 0x1000 | ||
#CHECK-NEXT: FileSize: 16 | ||
#CHECK-NEXT: MemSize: 16 | ||
#CHECK-NEXT: Flags [ | ||
#CHECK-NEXT: PF_R | ||
#CHECK-NEXT: PF_X | ||
#CHECK-NEXT: ] | ||
#CHECK-NEXT: Alignment: 4096 | ||
#CHECK-NEXT: } | ||
#CHECK-NEXT: ProgramHeader { | ||
#CHECK-NEXT: Type: PT_LOAD | ||
#CHECK-NEXT: Offset: 0x2000 | ||
#CHECK-NEXT: VirtualAddress: 0x2000 | ||
#CHECK-NEXT: PhysicalAddress: 0x2000 | ||
#CHECK-NEXT: FileSize: 16 | ||
#CHECK-NEXT: MemSize: 16 | ||
#CHECK-NEXT: Flags [ | ||
#CHECK-NEXT: PF_R | ||
#CHECK-NEXT: PF_W | ||
#CHECK-NEXT: ] | ||
#CHECK-NEXT: Alignment: 4096 | ||
#CHECK-NEXT: } | ||
#CHECK-NEXT: ProgramHeader { | ||
#CHECK-NEXT: Type: PT_GNU_STACK | ||
#CHECK-NEXT: Offset: 0x0 | ||
#CHECK-NEXT: VirtualAddress: 0x0 | ||
#CHECK-NEXT: PhysicalAddress: 0x0 | ||
#CHECK-NEXT: FileSize: 0 | ||
#CHECK-NEXT: MemSize: 0 | ||
#CHECK-NEXT: Flags [ | ||
#CHECK-NEXT: PF_R | ||
#CHECK-NEXT: PF_W | ||
#CHECK-NEXT: ] | ||
#CHECK-NEXT: Alignment: 0 | ||
#CHECK-NEXT: } | ||
#CHECK-NEXT: ProgramHeader { | ||
#CHECK-NEXT: Type: PT_LOAD | ||
#CHECK-NEXT: Offset: 0x2010 | ||
#CHECK-NEXT: VirtualAddress: 0x2010 | ||
#CHECK-NEXT: PhysicalAddress: 0x2010 | ||
#CHECK-NEXT: FileSize: 0 | ||
#CHECK-NEXT: MemSize: 64 | ||
#CHECK-NEXT: Flags [ | ||
#CHECK-NEXT: PF_R | ||
#CHECK-NEXT: ] | ||
#CHECK-NEXT: Alignment: 1 | ||
#CHECK-NEXT: } | ||
#CHECK-NEXT:] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters