diff --git a/llvm/test/Object/Inputs/invalid-phdr.elf b/llvm/test/Object/Inputs/invalid-phdr.elf deleted file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@&1 \ -RUN: | FileCheck %s - -CHECK: LLVM ERROR: program headers are longer than binary of size 4162: e_phoff = 0xffffff, e_phnum = 1, e_phentsize = 56 diff --git a/llvm/test/Object/invalid.test b/llvm/test/Object/invalid.test --- a/llvm/test/Object/invalid.test +++ b/llvm/test/Object/invalid.test @@ -650,3 +650,17 @@ Sections: - Type: SHT_NULL Link: 0xff + +## Check the case when the e_phoff field is invalid. +# RUN: yaml2obj --docnum=31 %s -o %t31 +# RUN: not llvm-objdump --private-headers %t31 2>&1 | FileCheck -DFILE=%t31 %s --check-prefix=INVALID-PHOFF + +# INVALID-PHOFF: error: '[[FILE]]': program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + EPhOff: 0xffffff diff --git a/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test b/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test @@ -0,0 +1,16 @@ +## Test how we handle the case when the e_phoff field is invalid. +# RUN: yaml2obj %s -o %t +# RUN: not llvm-objdump --private-headers %t 2>&1 | \ +# RUN: FileCheck -DFILE=%t %s --check-prefix=INVALID-PHOFF + +# INVALID-PHOFF: Program Header: +# 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 +# INVALID-PHOFF-NEXT: error: '[[FILE]]': program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + EPhOff: 0xffffff diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp --- a/llvm/tools/llvm-objdump/ELFDump.cpp +++ b/llvm/tools/llvm-objdump/ELFDump.cpp @@ -198,11 +198,17 @@ } } -template static void printProgramHeaders(const ELFFile *o) { +template +static void printProgramHeaders(const ELFFile *Obj, StringRef FileName) { outs() << "Program Header:\n"; - auto ProgramHeaderOrError = o->program_headers(); - if (!ProgramHeaderOrError) - report_fatal_error(toString(ProgramHeaderOrError.takeError())); + auto ProgramHeaderOrError = Obj->program_headers(); + if (!ProgramHeaderOrError) { + reportWarning("unable to read program headers: " + + toString(ProgramHeaderOrError.takeError()), + FileName); + return; + } + for (const typename ELFT::Phdr &Phdr : *ProgramHeaderOrError) { switch (Phdr.p_type) { case ELF::PT_DYNAMIC: @@ -346,13 +352,13 @@ void objdump::printELFFileHeader(const object::ObjectFile *Obj) { if (const auto *ELFObj = dyn_cast(Obj)) - printProgramHeaders(ELFObj->getELFFile()); + printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast(Obj)) - printProgramHeaders(ELFObj->getELFFile()); + printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast(Obj)) - printProgramHeaders(ELFObj->getELFFile()); + printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast(Obj)) - printProgramHeaders(ELFObj->getELFFile()); + printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName()); } void objdump::printELFDynamicSection(const object::ObjectFile *Obj) {