[PATCH] D57700: [llvm-readobj] Display sections that do not belong to a segment in the section-to-segment dump.

Matt Davis via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 4 10:34:19 PST 2019


mattd created this revision.
mattd added reviewers: grimar, rupprecht, jhenderson.
Herald added subscribers: arichardson, emaste.
Herald added a reviewer: espindola.

The following patch adds the "None" line to the section to segment mapping dump.
That line lists the sections that do not belong to any segment.
I realize that this change differs from GNU readelf which does not display the latter information.

I'd rather not add this "feature" under a command line option.  I think that might introduce confusion, since users would have to
make an additional decision as to if they want to see all of the section-to-segment map or just a subset of it.

Another option is to only print the "None" line if the `--segment-mapping` option is passed; however,
that might also introduce some confusion, because the section-to-segment map would be different between`--program-headers`
and the `--segment-mapping` output.  While the difference is just the "None" line, it seems that if we choose to display 
the segment-to-section mapping, then we should always display the whole map including the sections
that do not belong to segments.

  Section to Segment mapping:
    Segment Sections...
     00
     01     .interp
     02     .interp .note.ABI-tag .gnu.hash 
     03     .init_array .fini_array .dynamic 
     04     .dynamic
     05     .note.ABI-tag
     06     .eh_frame_hdr
     07
     08     .init_array .fini_array .dynamic .got
     None   .comment .symtab .strtab .shstrtab <--- THIS LINE


https://reviews.llvm.org/D57700

Files:
  lld/test/ELF/linkerscript/segment-none.s
  llvm/test/tools/llvm-readobj/gnu-phdrs.test
  llvm/tools/llvm-readobj/ELFDumper.cpp


Index: llvm/tools/llvm-readobj/ELFDumper.cpp
===================================================================
--- llvm/tools/llvm-readobj/ELFDumper.cpp
+++ llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -19,6 +19,7 @@
 #include "llvm-readobj.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/Optional.h"
 #include "llvm/ADT/PointerIntPair.h"
 #include "llvm/ADT/STLExtras.h"
@@ -3316,6 +3317,7 @@
 template <class ELFT>
 void GNUStyle<ELFT>::printSectionMapping(const ELFO *Obj) {
   OS << "\n Section to Segment mapping:\n  Segment Sections...\n";
+  DenseSet<const Elf_Shdr *> BelongsToSegment;
   int Phnum = 0;
   for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) {
     std::string Sections;
@@ -3330,12 +3332,25 @@
                           Phdr.p_type != ELF::PT_TLS;
       if (!TbssInNonTLS && checkTLSSections(Phdr, Sec) &&
           checkoffsets(Phdr, Sec) && checkVMA(Phdr, Sec) &&
-          checkPTDynamic(Phdr, Sec) && (Sec.sh_type != ELF::SHT_NULL))
+          checkPTDynamic(Phdr, Sec) && (Sec.sh_type != ELF::SHT_NULL)) {
         Sections += unwrapOrError(Obj->getSectionName(&Sec)).str() + " ";
+        BelongsToSegment.insert(&Sec);
+      }
     }
     OS << Sections << "\n";
     OS.flush();
   }
+
+  // Display sections that do not belong to a segment.
+  std::string None;
+  for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) {
+    if (BelongsToSegment.find(&Sec) == BelongsToSegment.end())
+      None += unwrapOrError(Obj->getSectionName(&Sec)).str() + ' ';
+  }
+  if (!None.empty()) {
+    OS << "   None  " << None << '\n';
+    OS.flush();
+  }
 }
 
 template <class ELFT>
Index: llvm/test/tools/llvm-readobj/gnu-phdrs.test
===================================================================
--- llvm/test/tools/llvm-readobj/gnu-phdrs.test
+++ llvm/test/tools/llvm-readobj/gnu-phdrs.test
@@ -59,6 +59,7 @@
 ELF32-NEXT:    07     .eh_frame_hdr
 ELF32-NEXT:    08
 ELF32-NEXT:    09     .tdata .ctors .dtors .jcr .dynamic .got
+ELF32-NEXT:    None   .comment .shstrtab .symtab .strtab
 
 ELF64-PHDRS: Elf file type is EXEC (Executable file)
 ELF64-PHDRS-NEXT: Entry point 0x400610
@@ -90,6 +91,7 @@
 ELF64-MAPPING-NEXT:    07     .eh_frame_hdr
 ELF64-MAPPING-NEXT:    08
 ELF64-MAPPING-NEXT:    09     .tdata .init_array .fini_array .jcr .dynamic .got
+ELF64-MAPPING-NEXT:    None   .comment .shstrtab .symtab .strtab
 
 ELF64-ONEMAPPING: Section to Segment mapping:
 ELF64-ONEMAPPING-NOT: Section to Segment mapping:
Index: lld/test/ELF/linkerscript/segment-none.s
===================================================================
--- lld/test/ELF/linkerscript/segment-none.s
+++ lld/test/ELF/linkerscript/segment-none.s
@@ -23,7 +23,7 @@
 
 # CHECK: Section to Segment mapping:
 # CHECK-NEXT: Segment Sections...
-# CHECK-NOT: .foo
+# CHECK: None {{.*}}.foo
 
 # DEFINED: Section to Segment mapping:
 # DEFINED-NEXT: Segment Sections...


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57700.185081.patch
Type: text/x-patch
Size: 2968 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190204/e6810d98/attachment.bin>


More information about the llvm-commits mailing list