mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
[llvm-readobj] - Stop using unwrapOrError() for all program_headers() calls.
program_headers() returns the list of program headers. This change allows to continue attempt of dumping when something is wrong with program headers. Differential revision: https://reviews.llvm.org/D83554
This commit is contained in:
parent
0e29ab3acf
commit
3e8c0f5b9f
@ -228,12 +228,12 @@ Sections:
|
||||
Link: .symtab
|
||||
Symbols: []
|
||||
|
||||
## Check that llvm-readobj reports an error if the e_phentsize field is broken.
|
||||
## Check that llvm-readobj reports a warning when the e_phentsize field is broken.
|
||||
|
||||
# RUN: not llvm-readobj --program-headers %p/Inputs/invalid-e_shnum.elf 2>&1 | \
|
||||
# RUN: llvm-readobj --program-headers %p/Inputs/invalid-e_shnum.elf 2>&1 | \
|
||||
# RUN: FileCheck -DFILE=%p/Inputs/invalid-e_shnum.elf --check-prefix=INVALID-PH-ENTSIZE %s
|
||||
|
||||
# INVALID-PH-ENTSIZE: error: '[[FILE]]': invalid e_phentsize: 12336
|
||||
# INVALID-PH-ENTSIZE: warning: '[[FILE]]': unable to dump program headers: invalid e_phentsize: 12336
|
||||
|
||||
## Check that llvm-readobj reports a warning when we have no SHT_SYMTAB_SHNDX section,
|
||||
## but have a symbol referencing it.
|
||||
@ -409,10 +409,10 @@ DynamicSymbols:
|
||||
## ELF header contains e_phentsize field with a value != sizeof(Elf_Phdr).
|
||||
## Check llvm-readobj reports it.
|
||||
|
||||
# RUN: not llvm-readobj -l %p/Inputs/corrupt-invalid-phentsize.elf.x86-64 2>&1 \
|
||||
# RUN: llvm-readobj -l %p/Inputs/corrupt-invalid-phentsize.elf.x86-64 2>&1 \
|
||||
# RUN: | FileCheck -DFILE=%p/Inputs/corrupt-invalid-phentsize.elf.x86-64 --check-prefix=PHENTSIZE %s
|
||||
|
||||
# PHENTSIZE: error: '[[FILE]]': invalid e_phentsize: 57
|
||||
# PHENTSIZE: warning: '[[FILE]]': unable to read program headers to locate the PT_DYNAMIC segment: invalid e_phentsize: 57
|
||||
|
||||
## The dynamic table contains DT_STRTAB with a value that is not in any loadable segment.
|
||||
## Check llvm-readobj reports it.
|
||||
|
@ -140,10 +140,11 @@
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
EPhEntSize: [[PHENTSIZE=56]]
|
||||
Sections:
|
||||
- Name: .dynstr
|
||||
Type: SHT_STRTAB
|
||||
@ -637,3 +638,154 @@ Sections:
|
||||
Value: 0x1
|
||||
- Tag: DT_NULL
|
||||
Value: 0x0
|
||||
|
||||
## Check how we dump dynamic tags when we are unable to read program headers.
|
||||
# RUN: yaml2obj --docnum=1 -DPHENTSIZE=1 %s -o %t-phentsize-err
|
||||
# RUN: llvm-readobj --dynamic-table %t-phentsize-err 2>&1 | \
|
||||
# RUN: FileCheck %s --implicit-check-not=warning: -DFILE=%t-phentsize-err \
|
||||
# RUN: --check-prefixes=PHENTSIZE-WARN,PHENTSIZE-LLVM
|
||||
# RUN: llvm-readelf --dynamic-table %t-phentsize-err 2>&1 | \
|
||||
# RUN: FileCheck %s --implicit-check-not=warning: -DFILE=%t-phentsize-err \
|
||||
# RUN: --check-prefixes=PHENTSIZE-WARN,PHENTSIZE-GNU
|
||||
|
||||
# PHENTSIZE-WARN: warning: '[[FILE]]': unable to read program headers to locate the PT_DYNAMIC segment: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_HASH: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_STRTAB: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_SYMTAB: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_RELA: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': DT_SYMENT value of 0x987 is not the size of a symbol (0x18)
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_REL: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_JMPREL: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_RELR: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_ANDROID_RELR: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': Unable to parse DT_GNU_HASH: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-NEXT: warning: '[[FILE]]': string table was not found
|
||||
|
||||
# PHENTSIZE-LLVM: DynamicSection [ (61 entries)
|
||||
# PHENTSIZE-LLVM-NEXT: Tag Type Name/Value
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000001 NEEDED Shared library: [<?>]
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000002 PLTRELSZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000003 PLTGOT 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000004 HASH 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000005 STRTAB 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000006 SYMTAB 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000007 RELA 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000008 RELASZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000009 RELAENT 1929 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000000A STRSZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000000B SYMENT 2439 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000000C INIT 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000000D FINI 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000000E SONAME Library soname: [<?>]
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000000F RPATH Library rpath: [<?>]
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000010 SYMBOLIC 0x1234567890ABCDEF
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000011 REL 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000012 RELSZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000013 RELENT 291 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000014 PLTREL RELA
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000015 DEBUG 0xFEDCBA0987654321
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000016 TEXTREL 0x1122334455667788
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000017 JMPREL 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000018 BIND_NOW 0x8877665544332211
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000019 INIT_ARRAY 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000001A FINI_ARRAY 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000001B INIT_ARRAYSZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000001C FINI_ARRAYSZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000001D RUNPATH Library runpath: [<?>]
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000000000001E FLAGS ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000020 PREINIT_ARRAY 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000021 PREINIT_ARRAYSZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000022 SYMTAB_SHNDX 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000023 RELRSZ 0x10
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000024 RELR 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000025 RELRENT 0x4321
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006000000F ANDROID_REL 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000060000010 ANDROID_RELSZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000060000011 ANDROID_RELA 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000060000012 ANDROID_RELASZ 16 (bytes)
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFE000 ANDROID_RELR 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFE001 ANDROID_RELRSZ 0x10
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFE003 ANDROID_RELRENT 0x1234
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFEF5 GNU_HASH 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFEF6 TLSDESC_PLT 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFEF7 TLSDESC_GOT 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFFF9 RELACOUNT 0
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFFFA RELCOUNT 0
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFFFB FLAGS_1 NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON PIE {{$}}
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFFF0 VERSYM 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFFFC VERDEF 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFFFD VERDEFNUM 0
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFFFE VERNEED 0x1000
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006FFFFFFF VERNEEDNUM 0
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [<?>]
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000007FFFFFFE USED Not needed object: [<?>]
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000007FFFFFFF FILTER Filter library: [<?>]
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000012345678 <unknown:>0x12345678 0x8765432187654321
|
||||
# PHENTSIZE-LLVM-NEXT: 0x000000006ABCDEF0 <unknown:>0x6abcdef0 0x9988776655443322
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000076543210 <unknown:>0x76543210 0x5555666677778888
|
||||
# PHENTSIZE-LLVM-NEXT: 0x0000000000000000 NULL 0x0
|
||||
# PHENTSIZE-LLVM-NEXT: ]
|
||||
|
||||
# PHENTSIZE-GNU: Dynamic section at offset 0xc0 contains 61 entries:
|
||||
# PHENTSIZE-GNU-NEXT: Tag Type Name/Value
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000001 (NEEDED) Shared library: [<?>]
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000002 (PLTRELSZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000003 (PLTGOT) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000004 (HASH) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000005 (STRTAB) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000006 (SYMTAB) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000007 (RELA) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000008 (RELASZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000009 (RELAENT) 1929 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000000a (STRSZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000000b (SYMENT) 2439 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000000c (INIT) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000000d (FINI) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000000e (SONAME) Library soname: [<?>]
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000000f (RPATH) Library rpath: [<?>]
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000010 (SYMBOLIC) 0x1234567890abcdef
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000011 (REL) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000012 (RELSZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000013 (RELENT) 291 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000014 (PLTREL) RELA
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000015 (DEBUG) 0xfedcba0987654321
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000016 (TEXTREL) 0x1122334455667788
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000017 (JMPREL) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000018 (BIND_NOW) 0x8877665544332211
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000019 (INIT_ARRAY) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000001a (FINI_ARRAY) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000001b (INIT_ARRAYSZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000001c (FINI_ARRAYSZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000001d (RUNPATH) Library runpath: [<?>]
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000000000001e (FLAGS) ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000020 (PREINIT_ARRAY) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000021 (PREINIT_ARRAYSZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000022 (SYMTAB_SHNDX) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000023 (RELRSZ) 0x10
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000024 (RELR) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000025 (RELRENT) 0x4321
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006000000f (ANDROID_REL) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000060000010 (ANDROID_RELSZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000060000011 (ANDROID_RELA) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000060000012 (ANDROID_RELASZ) 16 (bytes)
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006fffe000 (ANDROID_RELR) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006fffe001 (ANDROID_RELRSZ) 0x10
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006fffe003 (ANDROID_RELRENT) 0x1234
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffef5 (GNU_HASH) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffef6 (TLSDESC_PLT) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffef7 (TLSDESC_GOT) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffff9 (RELACOUNT) 0
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffffa (RELCOUNT) 0
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffffb (FLAGS_1) NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON PIE
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffff0 (VERSYM) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffffc (VERDEF) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffffd (VERDEFNUM) 0
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006ffffffe (VERNEED) 0x1000
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006fffffff (VERNEEDNUM) 0
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [<?>]
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000007ffffffe (USED) Not needed object: [<?>]
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000007fffffff (FILTER) Filter library: [<?>]
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000012345678 (<unknown:>0x12345678) 0x8765432187654321
|
||||
# PHENTSIZE-GNU-NEXT: 0x000000006abcdef0 (<unknown:>0x6abcdef0) 0x9988776655443322
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000076543210 (<unknown:>0x76543210) 0x5555666677778888
|
||||
# PHENTSIZE-GNU-NEXT: 0x0000000000000000 (NULL) 0x0
|
||||
|
@ -83,10 +83,12 @@
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
EPhEntSize: [[PHENTSIZE=56]]
|
||||
SHNum: [[SHNUM=6]]
|
||||
Sections:
|
||||
- Name: .note.ABI-tag
|
||||
Type: SHT_NOTE
|
||||
@ -193,3 +195,16 @@ ProgramHeaders:
|
||||
FileSize: 0xffff0000
|
||||
Sections:
|
||||
- Section: .note
|
||||
|
||||
## Check we report a warning when we are unable to locate the PT_NOTE
|
||||
## segment because of broken program headers.
|
||||
# RUN: yaml2obj --docnum=1 -DPHENTSIZE=1 -DSHNUM=0 %s -o %t6.so
|
||||
# RUN: llvm-readelf --notes %t6.so 2>&1 | FileCheck %s -DFILE=%t6.so --check-prefix=PHENTSIZE-WARN-GNU
|
||||
# RUN: llvm-readobj --notes %t6.so 2>&1 | FileCheck %s -DFILE=%t6.so --check-prefix=PHENTSIZE-WARN-LLVM
|
||||
|
||||
# PHENTSIZE-WARN-GNU: warning: '[[FILE]]': unable to read program headers to locate the PT_DYNAMIC segment: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-GNU: warning: '[[FILE]]': unable to read program headers to locate the PT_NOTE segment: invalid e_phentsize: 1
|
||||
|
||||
# PHENTSIZE-WARN-LLVM: Notes [
|
||||
# PHENTSIZE-WARN-LLVM-NEXT: warning: '[[FILE]]': unable to read program headers to locate the PT_NOTE segment: invalid e_phentsize: 1
|
||||
# PHENTSIZE-WARN-LLVM-NEXT: ]
|
||||
|
@ -354,3 +354,30 @@ ProgramHeaders:
|
||||
## Case 5: an arbitrary large offset that goes past the end of the file.
|
||||
- Type: PT_INTERP
|
||||
Offset: 0xAABBCCDDEEFF1122
|
||||
|
||||
## Check we report a warning when we are unable to read program headers.
|
||||
# RUN: yaml2obj --docnum=3 %s -o %t.phdr.err
|
||||
# RUN: llvm-readelf --program-headers %t.phdr.err 2>&1 | \
|
||||
# RUN: FileCheck %s -DFILE=%t.phdr.err --check-prefix=WARN-PHENTSIZE
|
||||
|
||||
# WARN-PHENTSIZE: Program Headers:
|
||||
# WARN-PHENTSIZE-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
|
||||
# WARN-PHENTSIZE-NEXT: warning: '[[FILE]]': unable to dump program headers: invalid e_phentsize: 1
|
||||
# WARN-PHENTSIZE: Section to Segment mapping:
|
||||
# WARN-PHENTSIZE-NEXT: Segment Sections...
|
||||
# WARN-PHENTSIZE-NEXT: warning: '[[FILE]]': can't read program headers to build section to segment mapping: invalid e_phentsize: 1
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
EPhEntSize: 1
|
||||
Sections:
|
||||
- Name: .foo
|
||||
Type: SHT_PROGBITS
|
||||
ProgramHeaders:
|
||||
- Type: PT_PHDR
|
||||
Sections:
|
||||
- Section: .foo
|
||||
|
@ -14,11 +14,11 @@
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
Entry: 0x12345678
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
EPhEntSize: [[PHENTSIZE=56]]
|
||||
Sections:
|
||||
- Name: .foo.begin
|
||||
Type: SHT_PROGBITS
|
||||
@ -74,3 +74,12 @@ ProgramHeaders:
|
||||
# NO-SECHDRS-NEXT: 00 {{$}}
|
||||
# NO-SECHDRS-NEXT: 01 {{$}}
|
||||
# NO-SECHDRS-NOT: {{.}}
|
||||
|
||||
## Check we report a warning when we are unable to read program headers.
|
||||
# RUN: yaml2obj %s -DPHENTSIZE=1 -o %t64-err1.elf
|
||||
# RUN: llvm-readelf --section-mapping %t64-err1.elf 2>&1 | \
|
||||
# RUN: FileCheck %s -DFILE=%t64-err1.elf --check-prefix=PHENTSIZE
|
||||
|
||||
# PHENTSIZE: Section to Segment mapping:
|
||||
# PHENTSIZE-NEXT: Segment Sections...
|
||||
# PHENTSIZE-NEXT: warning: '[[FILE]]': can't read program headers to build section to segment mapping: invalid e_phentsize: 1
|
||||
|
@ -168,3 +168,27 @@ ProgramHeaders:
|
||||
- Type: 0x65a3dbe6 ## PT_OPENBSD_RANDOMIZE
|
||||
- Type: 0x65a3dbe7 ## PT_OPENBSD_WXNEEDED
|
||||
- Type: 0x65a41be6 ## PT_OPENBSD_BOOTDATA
|
||||
|
||||
## Check we report a warning when we are unable to read program headers.
|
||||
# RUN: yaml2obj --docnum=2 %s -o %t.err
|
||||
# RUN: llvm-readobj --program-headers %t.err 2>&1 | \
|
||||
# RUN: FileCheck %s -DFILE=%t.err --check-prefix=WARN-PHENTSIZE
|
||||
|
||||
# WARN-PHENTSIZE: ProgramHeaders [
|
||||
# WARN-PHENTSIZE-NEXT: warning: '[[FILE]]': unable to dump program headers: invalid e_phentsize: 1
|
||||
# WARN-PHENTSIZE-NEXT: ]
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
EPhEntSize: 1
|
||||
Sections:
|
||||
- Name: .foo
|
||||
Type: SHT_PROGBITS
|
||||
ProgramHeaders:
|
||||
- Type: PT_PHDR
|
||||
Sections:
|
||||
- Section: .foo
|
||||
|
@ -94,6 +94,6 @@ ProgramHeaders:
|
||||
|
||||
## Override the e_phentsize field.
|
||||
# RUN: yaml2obj --docnum=2 %s -DPHENTSIZE=1 -o %t8
|
||||
# RUN: not llvm-readelf --file-headers %t8 2>&1 | FileCheck %s --check-prefix=PHENTSIZE
|
||||
# RUN: llvm-readelf --file-headers %t8 | FileCheck %s --check-prefix=PHENTSIZE
|
||||
|
||||
# PHENTSIZE: invalid e_phentsize: 1{{$}}
|
||||
# PHENTSIZE: Size of program headers: 1 (bytes)
|
||||
|
@ -1901,12 +1901,17 @@ std::pair<const typename ELFT::Phdr *, const typename ELFT::Shdr *>
|
||||
ELFDumper<ELFT>::findDynamic(const ELFFile<ELFT> *Obj) {
|
||||
// Try to locate the PT_DYNAMIC header.
|
||||
const Elf_Phdr *DynamicPhdr = nullptr;
|
||||
for (const Elf_Phdr &Phdr :
|
||||
unwrapOrError(ObjF->getFileName(), Obj->program_headers())) {
|
||||
if (Phdr.p_type != ELF::PT_DYNAMIC)
|
||||
continue;
|
||||
DynamicPhdr = &Phdr;
|
||||
break;
|
||||
if (Expected<ArrayRef<Elf_Phdr>> PhdrsOrErr = Obj->program_headers()) {
|
||||
for (const Elf_Phdr &Phdr : *PhdrsOrErr) {
|
||||
if (Phdr.p_type != ELF::PT_DYNAMIC)
|
||||
continue;
|
||||
DynamicPhdr = &Phdr;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
this->reportUniqueWarning(createError(
|
||||
"unable to read program headers to locate the PT_DYNAMIC segment: " +
|
||||
toString(PhdrsOrErr.takeError())));
|
||||
}
|
||||
|
||||
// Try to locate the .dynamic section in the sections header table.
|
||||
@ -4340,8 +4345,15 @@ void GNUStyle<ELFT>::printProgramHeaders(const ELFO *Obj) {
|
||||
|
||||
unsigned Width = ELFT::Is64Bits ? 18 : 10;
|
||||
unsigned SizeWidth = ELFT::Is64Bits ? 8 : 7;
|
||||
for (const auto &Phdr :
|
||||
unwrapOrError(this->FileName, Obj->program_headers())) {
|
||||
|
||||
Expected<ArrayRef<Elf_Phdr>> PhdrsOrErr = Obj->program_headers();
|
||||
if (!PhdrsOrErr) {
|
||||
this->reportUniqueWarning(createError("unable to dump program headers: " +
|
||||
toString(PhdrsOrErr.takeError())));
|
||||
return;
|
||||
}
|
||||
|
||||
for (const Elf_Phdr &Phdr : *PhdrsOrErr) {
|
||||
Fields[0].Str = getElfPtType(Header->e_machine, Phdr.p_type);
|
||||
Fields[1].Str = to_string(format_hex(Phdr.p_offset, 8));
|
||||
Fields[2].Str = to_string(format_hex(Phdr.p_vaddr, Width));
|
||||
@ -4388,8 +4400,16 @@ void GNUStyle<ELFT>::printSectionMapping(const ELFO *Obj) {
|
||||
OS << "\n Section to Segment mapping:\n Segment Sections...\n";
|
||||
DenseSet<const Elf_Shdr *> BelongsToSegment;
|
||||
int Phnum = 0;
|
||||
for (const Elf_Phdr &Phdr :
|
||||
unwrapOrError(this->FileName, Obj->program_headers())) {
|
||||
|
||||
Expected<ArrayRef<Elf_Phdr>> PhdrsOrErr = Obj->program_headers();
|
||||
if (!PhdrsOrErr) {
|
||||
this->reportUniqueWarning(createError(
|
||||
"can't read program headers to build section to segment mapping: " +
|
||||
toString(PhdrsOrErr.takeError())));
|
||||
return;
|
||||
}
|
||||
|
||||
for (const Elf_Phdr &Phdr : *PhdrsOrErr) {
|
||||
std::string Sections;
|
||||
OS << format(" %2.2d ", Phnum++);
|
||||
// Check if each section is in a segment and then print mapping.
|
||||
@ -5506,8 +5526,15 @@ void GNUStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {
|
||||
reportError(std::move(Err), this->FileName);
|
||||
}
|
||||
} else {
|
||||
for (const auto &P :
|
||||
unwrapOrError(this->FileName, Obj->program_headers())) {
|
||||
Expected<ArrayRef<Elf_Phdr>> PhdrsOrErr = Obj->program_headers();
|
||||
if (!PhdrsOrErr) {
|
||||
this->reportUniqueWarning(createError(
|
||||
"unable to read program headers to locate the PT_NOTE segment: " +
|
||||
toString(PhdrsOrErr.takeError())));
|
||||
return;
|
||||
}
|
||||
|
||||
for (const Elf_Phdr &P : *PhdrsOrErr) {
|
||||
if (P.p_type != PT_NOTE)
|
||||
continue;
|
||||
PrintHeader(/*SecName=*/None, P.p_offset, P.p_filesz);
|
||||
@ -6523,8 +6550,14 @@ template <class ELFT>
|
||||
void LLVMStyle<ELFT>::printProgramHeaders(const ELFO *Obj) {
|
||||
ListScope L(W, "ProgramHeaders");
|
||||
|
||||
for (const Elf_Phdr &Phdr :
|
||||
unwrapOrError(this->FileName, Obj->program_headers())) {
|
||||
Expected<ArrayRef<Elf_Phdr>> PhdrsOrErr = Obj->program_headers();
|
||||
if (!PhdrsOrErr) {
|
||||
this->reportUniqueWarning(createError("unable to dump program headers: " +
|
||||
toString(PhdrsOrErr.takeError())));
|
||||
return;
|
||||
}
|
||||
|
||||
for (const Elf_Phdr &Phdr : *PhdrsOrErr) {
|
||||
DictScope P(W, "ProgramHeader");
|
||||
W.printHex("Type",
|
||||
getElfSegmentType(Obj->getHeader()->e_machine, Phdr.p_type),
|
||||
@ -6819,8 +6852,15 @@ void LLVMStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {
|
||||
reportError(std::move(Err), this->FileName);
|
||||
}
|
||||
} else {
|
||||
for (const auto &P :
|
||||
unwrapOrError(this->FileName, Obj->program_headers())) {
|
||||
Expected<ArrayRef<Elf_Phdr>> PhdrsOrErr = Obj->program_headers();
|
||||
if (!PhdrsOrErr) {
|
||||
this->reportUniqueWarning(createError(
|
||||
"unable to read program headers to locate the PT_NOTE segment: " +
|
||||
toString(PhdrsOrErr.takeError())));
|
||||
return;
|
||||
}
|
||||
|
||||
for (const Elf_Phdr &P : *PhdrsOrErr) {
|
||||
if (P.p_type != PT_NOTE)
|
||||
continue;
|
||||
DictScope D(W, "NoteSection");
|
||||
|
Loading…
Reference in New Issue
Block a user