[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