diff options
| -rw-r--r-- | lld/test/ELF/linkerscript/segment-none.s | 2 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-readobj/gnu-phdrs.test | 2 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 17 |
3 files changed, 19 insertions, 2 deletions
diff --git a/lld/test/ELF/linkerscript/segment-none.s b/lld/test/ELF/linkerscript/segment-none.s index 36d09e77647..85739747ac9 100644 --- a/lld/test/ELF/linkerscript/segment-none.s +++ b/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... diff --git a/llvm/test/tools/llvm-readobj/gnu-phdrs.test b/llvm/test/tools/llvm-readobj/gnu-phdrs.test index ee196509673..f6840e5039c 100644 --- a/llvm/test/tools/llvm-readobj/gnu-phdrs.test +++ b/llvm/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/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 1757fd6cce5..2c9b159575b 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/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 @@ void GNUStyle<ELFT>::printProgramHeaders(const ELFO *Obj) { 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 @@ void GNUStyle<ELFT>::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 <class ELFT> |

