diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test --- a/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test @@ -2,10 +2,8 @@ # RUN: yaml2obj %s -o %t # RUN: llvm-readelf --section-mapping %t | FileCheck %s --strict-whitespace --match-full-lines -# CHECK: Section to Segment mapping: -# CHECK-NEXT: Segment Sections... -# CHECK-NEXT: None .foo .strtab .shstrtab -# CHECK-NOT:{{.}} +# CHECK:There are no program headers in this file. +# CHECK-NOT:{{.}} --- !ELF FileHeader: diff --git a/llvm/test/tools/llvm-readobj/ELF/many-sections.s b/llvm/test/tools/llvm-readobj/ELF/many-sections.s --- a/llvm/test/tools/llvm-readobj/ELF/many-sections.s +++ b/llvm/test/tools/llvm-readobj/ELF/many-sections.s @@ -38,12 +38,8 @@ # GNU2: Number of section headers: 0 # GNU2: Section header string table index: 65535 (corrupt: out of range) -# GNU2: There are 0 section headers, starting at offset 0x0: # GNU2-EMPTY: -# GNU2-NEXT: Section Headers: -# GNU2-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al -# GNU2-NEXT: warning: '[[FILE]]': e_shstrndx == SHN_XINDEX, but the section header table is empty -# GNU2-NEXT: Key to Flags: +# GNU2: There are no sections in this file. # RUN: llvm-readobj --file-headers --sections %t2 | \ # RUN: FileCheck %s --check-prefix=LLVM2 --implicit-check-not="warning:" diff --git a/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test b/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test --- a/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test +++ b/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test @@ -8,13 +8,7 @@ # LLVM: ProgramHeaders [ # LLVM-NEXT: ] -# GNU: There are 0 program headers -# GNU: Program Headers: -# GNU-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align -# GNU-EMPTY: -# GNU-NEXT: Section to Segment mapping: -# GNU-NEXT: Segment Sections... -# GNU-NEXT: None .strtab .shstrtab +# GNU: There are no program headers in this file. --- !ELF FileHeader: diff --git a/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test b/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test --- a/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test +++ b/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test @@ -15,7 +15,8 @@ # GNU: Number of section headers: 0 # GNU: Section header string table index: 0 -# GNU: There are 0 section headers +# GNU-EMPTY: +# GNU: There are no sections in this file. # GNU-NOT: Symbol table '{{.*}}' contains {{.*}} entries --- !ELF diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3681,8 +3681,12 @@ } template void GNUELFDumper::printSectionHeaders() { - unsigned Bias = ELFT::Is64Bits ? 0 : 8; ArrayRef Sections = cantFail(this->Obj.sections()); + if (Sections.size() == 0) { + OS << "\nThere are no sections in this file.\n"; + return; + } + unsigned Bias = ELFT::Is64Bits ? 0 : 8; OS << "There are " << to_string(Sections.size()) << " section headers, starting at offset " << "0x" << utohexstr(this->Obj.getHeader().e_shoff, /*LowerCase=*/true) << ":\n\n"; @@ -4062,6 +4066,10 @@ template void GNUELFDumper::printSectionDetails() { ArrayRef Sections = cantFail(this->Obj.sections()); + if (Sections.size() == 0) { + OS << "\nThere are no sections in this file.\n"; + return; + } OS << "There are " << to_string(Sections.size()) << " section headers, starting at offset " << "0x" << utohexstr(this->Obj.getHeader().e_shoff, /*LowerCase=*/true) << ":\n\n"; @@ -4245,13 +4253,24 @@ template void GNUELFDumper::printProgramHeaders( bool PrintProgramHeaders, cl::boolOrDefault PrintSectionMapping) { - if (PrintProgramHeaders) - printProgramHeaders(); + const Elf_Ehdr &Header = this->Obj.getHeader(); + if (PrintProgramHeaders) { + if (Header.e_phnum > 0) { + printProgramHeaders(); + } else { + OS << "\nThere are no program headers in this file.\n"; + } + } // Display the section mapping along with the program headers, unless // -section-mapping is explicitly set to false. - if (PrintSectionMapping != cl::BOU_FALSE) - printSectionMapping(); + if (PrintSectionMapping != cl::BOU_FALSE) { + if (!PrintProgramHeaders && Header.e_phnum == 0) { + OS << "\nThere are no program headers in this file.\n"; + } else { + printSectionMapping(); + } + } } template void GNUELFDumper::printProgramHeaders() {