From: Matt Davis Date: Tue, 5 Feb 2019 21:01:01 +0000 (+0000) Subject: [llvm-readobj] Display sections that do not belong to a segment in the section-mapping X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9d070e11f0f4d9fc8c2e725ea56d6230b32916cd;p=llvm [llvm-readobj] Display sections that do not belong to a segment in the section-mapping Summary: 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 `--section-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 `--section-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 ``` Reviewers: grimar, rupprecht, jhenderson, espindola Reviewed By: rupprecht Subscribers: khemant, emaste, arichardson, llvm-commits Differential Revision: https://reviews.llvm.org/D57700 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353217 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-readobj/gnu-phdrs.test b/test/tools/llvm-readobj/gnu-phdrs.test index ee196509673..f6840e5039c 100644 --- a/test/tools/llvm-readobj/gnu-phdrs.test +++ b/test/tools/llvm-readobj/gnu-phdrs.test @@ -59,6 +59,7 @@ ELF32-NEXT: 06 .tdata .tbss 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: 06 .tdata .tbss 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: diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 1757fd6cce5..2c9b159575b 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/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 @@ void GNUStyle::printProgramHeaders(const ELFO *Obj) { template void GNUStyle::printSectionMapping(const ELFO *Obj) { OS << "\n Section to Segment mapping:\n Segment Sections...\n"; + DenseSet BelongsToSegment; int Phnum = 0; for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) { std::string Sections; @@ -3330,12 +3332,25 @@ void GNUStyle::printSectionMapping(const ELFO *Obj) { 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 Sections; + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { + if (BelongsToSegment.find(&Sec) == BelongsToSegment.end()) + Sections += unwrapOrError(Obj->getSectionName(&Sec)).str() + ' '; + } + if (!Sections.empty()) { + OS << " None " << Sections << '\n'; + OS.flush(); + } } template