diff options
author | Prabhu Karthikeyan Rajasekaran <prabhukr@google.com> | 2022-08-16 00:46:05 +0000 |
---|---|---|
committer | Prabhu Karthikeyan Rajasekaran <prabhukr@google.com> | 2022-08-17 16:51:15 +0000 |
commit | a36de097faf7ada39a5fd38ddc4cb8c8e258bd2e (patch) | |
tree | 6f722e0623b4a8b2d8962715928296381739b4ea | |
parent | 550fab53e1dab6e5640c62a9a30a25a59ca1e735 (diff) | |
download | llvm-a36de097faf7ada39a5fd38ddc4cb8c8e258bd2e.zip llvm-a36de097faf7ada39a5fd38ddc4cb8c8e258bd2e.tar.gz llvm-a36de097faf7ada39a5fd38ddc4cb8c8e258bd2e.tar.bz2 |
[llvm-readelf] Render messages similar to that of `GNU binutils readelf` when no sections and/or no headers.
When there are no section headers section information printed by llvm-readelf is not useful and unnecessarily verbose. When there are no program headers there's a similar verbose output shown when section mapping is requested. Simplifying the message shown in these cases to match the behavior of `GNU binuntils readelf`.
Reviewed By: jhenderson, MaskRay
Differential Revision: https://reviews.llvm.org/D130670
-rw-r--r-- | llvm/test/tools/llvm-readobj/ELF/many-sections.s | 7 | ||||
-rw-r--r-- | llvm/test/tools/llvm-readobj/ELF/no-phdrs.test | 4 | ||||
-rw-r--r-- | llvm/test/tools/llvm-readobj/ELF/no-shdrs.test | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 37 |
4 files changed, 38 insertions, 14 deletions
diff --git a/llvm/test/tools/llvm-readobj/ELF/many-sections.s b/llvm/test/tools/llvm-readobj/ELF/many-sections.s index 97fa77f..cf70149 100644 --- a/llvm/test/tools/llvm-readobj/ELF/many-sections.s +++ b/llvm/test/tools/llvm-readobj/ELF/many-sections.s @@ -35,15 +35,14 @@ Sections: # RUN: llvm-readelf --file-headers --sections %t2 2>&1 | \ # RUN: FileCheck %s -DFILE=%t2 --check-prefix=GNU2 +# RUN: llvm-readelf --file-headers --section-details %t2 2>&1 | \ +# RUN: FileCheck %s -DFILE=%t2 --check-prefix=GNU2 # 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 index 8b04e35..24e3d45 100644 --- a/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test +++ b/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test @@ -8,9 +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: There are no program headers in this file. # GNU-EMPTY: # GNU-NEXT: Section to Segment mapping: # GNU-NEXT: Segment Sections... diff --git a/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test b/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test index 218b0b1..27fcd06 100644 --- 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 index b26868a..0e543b5 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3693,8 +3693,16 @@ static void printSectionDescription(formatted_raw_ostream &OS, } template <class ELFT> void GNUELFDumper<ELFT>::printSectionHeaders() { - unsigned Bias = ELFT::Is64Bits ? 0 : 8; ArrayRef<Elf_Shdr> Sections = cantFail(this->Obj.sections()); + if (Sections.empty()) { + OS << "\nThere are no sections in this file.\n"; + Expected<StringRef> 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"; @@ -4074,6 +4082,14 @@ template <class ELFT> void GNUELFDumper<ELFT>::printHashSymbols() { template <class ELFT> void GNUELFDumper<ELFT>::printSectionDetails() { ArrayRef<Elf_Shdr> Sections = cantFail(this->Obj.sections()); + if (Sections.empty()) { + OS << "\nThere are no sections in this file.\n"; + Expected<StringRef> 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"; @@ -4257,12 +4273,21 @@ static bool checkPTDynamic(const typename ELFT::Phdr &Phdr, template <class ELFT> void GNUELFDumper<ELFT>::printProgramHeaders( bool PrintProgramHeaders, cl::boolOrDefault PrintSectionMapping) { - if (PrintProgramHeaders) - printProgramHeaders(); + const bool ShouldPrintSectionMapping = (PrintSectionMapping != cl::BOU_FALSE); + // Exit early if no program header or section mapping details were requested. + if (!PrintProgramHeaders && !ShouldPrintSectionMapping) + return; + + if (PrintProgramHeaders) { + const Elf_Ehdr &Header = this->Obj.getHeader(); + if (Header.e_phnum == 0) { + OS << "\nThere are no program headers in this file.\n"; + } else { + printProgramHeaders(); + } + } - // Display the section mapping along with the program headers, unless - // -section-mapping is explicitly set to false. - if (PrintSectionMapping != cl::BOU_FALSE) + if (ShouldPrintSectionMapping) printSectionMapping(); } |