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 @@ -8,6 +8,7 @@ # RUN: yaml2obj --docnum=1 %s -o %t1 # RUN: llvm-readelf --file-headers -S %t1 | FileCheck %s --check-prefix=GNU1 +# RUN: llvm-readelf --file-headers --section-details %t1 | FileCheck %s --check-prefix=GNU1 # GNU1: Number of section headers: 0 (3) # GNU1: Section header string table index: 65535 (2) # GNU1: There are 3 section headers, starting at offset 0x58 @@ -38,12 +39,9 @@ # 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: There are no sections in this file. # GNU2-NEXT: warning: '[[FILE]]': e_shstrndx == SHN_XINDEX, but the section header table is empty -# GNU2-NEXT: Key to Flags: # 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 @@ -5,6 +5,7 @@ # RUN: llvm-objcopy --strip-sections %t.raw %t.o # RUN: llvm-readobj --file-headers --section-headers --symbols %t.o | FileCheck %s --check-prefix=LLVM # RUN: llvm-readelf --file-headers --section-headers --symbols %t.o | FileCheck %s --check-prefix=GNU --allow-empty +# RUN: llvm-readelf --file-headers --section-details --symbols %t.o | FileCheck %s --check-prefix=GNU --allow-empty # LLVM: SectionHeaderCount: 0 # LLVM: StringTableSectionIndex: 0 @@ -15,7 +16,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,16 @@ } 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"; + Expected SecStrTableOrErr = + this->Obj.getSectionStringTable(Sections, this->WarningHandler); + if (!SecStrTableOrErr) + this->reportUniqueWarning(SecStrTableOrErr.takeError()); + 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 +4070,14 @@ template void GNUELFDumper::printSectionDetails() { ArrayRef Sections = cantFail(this->Obj.sections()); + if (Sections.size() == 0) { + OS << "\nThere are no sections in this file.\n"; + Expected SecStrTableOrErr = + this->Obj.getSectionStringTable(Sections, this->WarningHandler); + if (!SecStrTableOrErr) + this->reportUniqueWarning(SecStrTableOrErr.takeError()); + 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 +4261,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() {