Skip to content

Commit 84a1bc7

Browse files
author
Georgii Rymar
committed
[test/Object][llvm-objdump] - llvm-objdump: don't abort() when the e_phoff field is invalid and refine testing.
llvm-objdump currently calls report_fatal_error() when the e_phoff field is invalid. This is tested by elf-invalid-phdr.test which has the following issues: 1) It uses a precompiled object. 2) it could be a part of invalid.test. 3) It tests the Object lib, but we have no separate test for llvm-objdump. This patch addresses issues mentioned. Differential revision: https://reviews.llvm.org/D83559
1 parent 7ef1763 commit 84a1bc7

File tree

5 files changed

+44
-34
lines changed

5 files changed

+44
-34
lines changed
-4.06 KB
Binary file not shown.

llvm/test/Object/elf-invalid-phdr.test

Lines changed: 0 additions & 26 deletions
This file was deleted.

llvm/test/Object/invalid.test

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,3 +650,17 @@ FileHeader:
650650
Sections:
651651
- Type: SHT_NULL
652652
Link: 0xff
653+
654+
## Check the case when the e_phoff field is invalid.
655+
# RUN: yaml2obj --docnum=31 %s -o %t31
656+
# RUN: not llvm-objdump --private-headers %t31 2>&1 | FileCheck -DFILE=%t31 %s --check-prefix=INVALID-PHOFF
657+
658+
# INVALID-PHOFF: error: '[[FILE]]': program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0
659+
660+
--- !ELF
661+
FileHeader:
662+
Class: ELFCLASS64
663+
Data: ELFDATA2LSB
664+
Type: ET_EXEC
665+
Machine: EM_X86_64
666+
EPhOff: 0xffffff
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
## Test how we handle the case when the e_phoff field is invalid.
2+
# RUN: yaml2obj %s -o %t
3+
# RUN: not llvm-objdump --private-headers %t 2>&1 | \
4+
# RUN: FileCheck -DFILE=%t %s --check-prefix=INVALID-PHOFF
5+
6+
# INVALID-PHOFF: Program Header:
7+
# INVALID-PHOFF-NEXT: warning: '[[FILE]]': unable to read program headers: program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0
8+
# INVALID-PHOFF-NEXT: error: '[[FILE]]': program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0
9+
10+
--- !ELF
11+
FileHeader:
12+
Class: ELFCLASS64
13+
Data: ELFDATA2LSB
14+
Type: ET_EXEC
15+
Machine: EM_X86_64
16+
EPhOff: 0xffffff

llvm/tools/llvm-objdump/ELFDump.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,11 +198,17 @@ static void printDynamicSection(const ELFFile<ELFT> *Elf, StringRef Filename) {
198198
}
199199
}
200200

201-
template <class ELFT> static void printProgramHeaders(const ELFFile<ELFT> *o) {
201+
template <class ELFT>
202+
static void printProgramHeaders(const ELFFile<ELFT> *Obj, StringRef FileName) {
202203
outs() << "Program Header:\n";
203-
auto ProgramHeaderOrError = o->program_headers();
204-
if (!ProgramHeaderOrError)
205-
report_fatal_error(toString(ProgramHeaderOrError.takeError()));
204+
auto ProgramHeaderOrError = Obj->program_headers();
205+
if (!ProgramHeaderOrError) {
206+
reportWarning("unable to read program headers: " +
207+
toString(ProgramHeaderOrError.takeError()),
208+
FileName);
209+
return;
210+
}
211+
206212
for (const typename ELFT::Phdr &Phdr : *ProgramHeaderOrError) {
207213
switch (Phdr.p_type) {
208214
case ELF::PT_DYNAMIC:
@@ -346,13 +352,13 @@ static void printSymbolVersionInfo(const ELFFile<ELFT> *Elf,
346352

347353
void objdump::printELFFileHeader(const object::ObjectFile *Obj) {
348354
if (const auto *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj))
349-
printProgramHeaders(ELFObj->getELFFile());
355+
printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName());
350356
else if (const auto *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj))
351-
printProgramHeaders(ELFObj->getELFFile());
357+
printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName());
352358
else if (const auto *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
353-
printProgramHeaders(ELFObj->getELFFile());
359+
printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName());
354360
else if (const auto *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
355-
printProgramHeaders(ELFObj->getELFFile());
361+
printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName());
356362
}
357363

358364
void objdump::printELFDynamicSection(const object::ObjectFile *Obj) {

0 commit comments

Comments
 (0)