[llvm] a36de09 - [llvm-readelf] Render messages similar to that of `GNU binutils readelf` when no sections and/or no headers.
Prabhu Karthikeyan Rajasekaran via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 17 09:51:21 PDT 2022
Author: Prabhu Karthikeyan Rajasekaran
Date: 2022-08-17T16:51:15Z
New Revision: a36de097faf7ada39a5fd38ddc4cb8c8e258bd2e
URL: https://github.com/llvm/llvm-project/commit/a36de097faf7ada39a5fd38ddc4cb8c8e258bd2e
DIFF: https://github.com/llvm/llvm-project/commit/a36de097faf7ada39a5fd38ddc4cb8c8e258bd2e.diff
LOG: [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
Added:
Modified:
llvm/test/tools/llvm-readobj/ELF/many-sections.s
llvm/test/tools/llvm-readobj/ELF/no-phdrs.test
llvm/test/tools/llvm-readobj/ELF/no-shdrs.test
llvm/tools/llvm-readobj/ELFDumper.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-readobj/ELF/many-sections.s b/llvm/test/tools/llvm-readobj/ELF/many-sections.s
index 97fa77fc4aa1e..cf70149bf988c 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 8b04e357775ea..24e3d45a85cb6 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 218b0b15e5a4b..27fcd06c0fce7 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 b26868a3b2628..0e543b5a9e203 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();
}
More information about the llvm-commits
mailing list