From: Matt Davis Date: Wed, 27 Feb 2019 18:39:17 +0000 (+0000) Subject: [llvm-readobj] Print section type values for unknown sections. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ce64e29e1fbbea2eaa2c5db39f3c2e625ad354b9;p=llvm [llvm-readobj] Print section type values for unknown sections. Summary: This patch displays a hexadecimal section value (Elf_Shdr::sh_type) or section-relative offset when printing unknown sections. Here is a subset of the output (ignoring the fields following "Type" when dumping an ELF's GNU `--section-headers` table). Section Headers: ``` [Nr] Name Type [16] android_rel LOOS+0x1 [17] android_rela LOOS+0x2 [27] unknown 0x1000: [28] loos LOOS+0 [30] hios VERSYM [31] loproc LOPROC+0 [33] hiproc LOPROC+0xFFFFFFF [34] louser LOUSER+0 [36] hiuser LOUSER+0x7FFFFFFF ``` As a comparison, the previous output looked something like the above, but with a blank "Type" field: ``` [Nr] Name Type [27] unknown [28] loos [30] hios VERSYM [31] loproc [33] hiproc [34] louser [36] hiuser ``` This fixes PR40773 Reviewers: jhenderson, rupprecht, Bigcheese Reviewed By: jhenderson, rupprecht, Bigcheese Subscribers: MaskRay, Bigcheese, srhines, jdoerfert, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58701 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355014 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-readobj/elf-section-types.test b/test/tools/llvm-readobj/elf-section-types.test index 350b1b4dcc0..66bfa8a4b93 100644 --- a/test/tools/llvm-readobj/elf-section-types.test +++ b/test/tools/llvm-readobj/elf-section-types.test @@ -63,14 +63,20 @@ # LLVM: Type: Unknown (0x1000) # LLVM: Name: loos # LLVM: Type: Unknown (0x60000000) +# LLVM: Name: fooos +# LLVM: Type: Unknown (0x60000F00) # LLVM: Name: hios # LLVM: Type: SHT_GNU_versym # LLVM: Name: loproc # LLVM: Type: Unknown (0x70000000) +# LLVM: Name: fooproc +# LLVM: Type: Unknown (0x70000F00) # LLVM: Name: hiproc # LLVM: Type: Unknown (0x7FFFFFFF) # LLVM: Name: louser # LLVM: Type: Unknown (0x80000000) +# LLVM: Name: foouser +# LLVM: Type: Unknown (0x80000F00) # LLVM: Name: hiuser # LLVM: Type: Unknown (0xFFFFFFFF) # LLVM: Name: .symtab @@ -94,10 +100,8 @@ # GNU-NEXT: group GROUP # GNU-NEXT: symtab_shndx SYMTAB SECTION INDICES # GNU-NEXT: relr RELR -## FIXME: These next two lines should print something like ANDROID_REL and ANDROID_RELA. -## See https://bugs.llvm.org/show_bug.cgi?id=40773. -# GNU-NEXT: android_rel 0000000000000000 -# GNU-NEXT: android_rela 0000000000000000 +# GNU-NEXT: android_rel ANDROID_REL +# GNU-NEXT: android_rela ANDROID_RELA # GNU-NEXT: android_relr RELR # GNU-NEXT: llvm_odrtab LLVM_ODRTAB # GNU-NEXT: linker_options LLVM_LINKER_OPTIONS @@ -107,8 +111,18 @@ # GNU-NEXT: gnu_hash GNU_HASH # GNU-NEXT: gnu_verdef VERDEF # GNU-NEXT: gnu_verneed VERNEED -## TODO: Add testing for unknown section types in GNU output style. -## See https://bugs.llvm.org/show_bug.cgi?id=40773. +# GNU-NEXT: unknown 0x1000: +# GNU-NEXT: loos LOOS+0x0 +# GNU-NEXT: fooos LOOS+0xF00 +# GNU-NEXT: hios VERSYM +# GNU-NEXT: loproc LOPROC+0x0 +# GNU-NEXT: fooproc LOPROC+0xF00 +# GNU-NEXT: hiproc LOPROC+0xFFFFFFF +# GNU-NEXT: louser LOUSER+0x0 +# GNU-NEXT: foouser LOUSER+0xF00 +# GNU-NEXT: hiuser LOUSER+0x7FFFFFFF +# GNU-NEXT: .symtab SYMTAB +# GNU-NEXT: .strtab STRTAB --- !ELF FileHeader: @@ -186,15 +200,21 @@ Sections: Type: 0x1000 - Name: loos Type: 0x60000000 + - Name: fooos + Type: 0x60000F00 - Name: hios Type: 0x6fffffff Entries: [] - Name: loproc Type: 0x70000000 + - Name: fooproc + Type: 0x70000F00 - Name: hiproc Type: 0x7fffffff - Name: louser Type: 0x80000000 + - Name: foouser + Type: 0x80000F00 - Name: hiuser Type: 0xffffffff Symbols: diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 21ab930024c..3597acfe061 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -2830,7 +2830,21 @@ template void GNUStyle::printRelocations(const ELFO *Obj) { OS << "\nThere are no relocations in this file.\n"; } -std::string getSectionTypeString(unsigned Arch, unsigned Type) { +// Print the offset of a particular section from anyone of the ranges: +// [SHT_LOOS, SHT_HIOS], [SHT_LOPROC, SHT_HIPROC], [SHT_LOUSER, SHT_HIUSER]. +// If 'Type' does not fall within any of those ranges, then a string is +// returned as '' followed by the type value. +static std::string getSectionTypeOffsetString(unsigned Type) { + if (Type >= SHT_LOOS && Type <= SHT_HIOS) + return "LOOS+0x" + to_hexString(Type - SHT_LOOS); + else if (Type >= SHT_LOPROC && Type <= SHT_HIPROC) + return "LOPROC+0x" + to_hexString(Type - SHT_LOPROC); + else if (Type >= SHT_LOUSER && Type <= SHT_HIUSER) + return "LOUSER+0x" + to_hexString(Type - SHT_LOUSER); + return "0x" + to_hexString(Type) + ": "; +} + +static std::string getSectionTypeString(unsigned Arch, unsigned Type) { using namespace ELF; switch (Arch) { @@ -2903,6 +2917,10 @@ std::string getSectionTypeString(unsigned Arch, unsigned Type) { return "GROUP"; case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICES"; + case SHT_ANDROID_REL: + return "ANDROID_REL"; + case SHT_ANDROID_RELA: + return "ANDROID_RELA"; case SHT_RELR: case SHT_ANDROID_RELR: return "RELR"; @@ -2926,7 +2944,7 @@ std::string getSectionTypeString(unsigned Arch, unsigned Type) { case SHT_GNU_versym: return "VERSYM"; default: - return ""; + return getSectionTypeOffsetString(Type); } return ""; }