Skip to content

Commit

Permalink
[llvm-readobj] - Remove an excessive helper for printing dynamic tags.
Browse files Browse the repository at this point in the history
This removes the `getTypeString` from readeobj source because it
almost duplicates the existent method: `ELFFile<ELFT>::getDynamicTagAsString`.

Side effect: now it prints "<unknown:>0xHEXVALUE" instead of "(unknown)" for unknown values.
llvm-readelf before this patch printed:

```
0x0000000012345678 (unknown) 0x8765432187654321
0x000000006abcdef0 (unknown) 0x9988776655443322
0x0000000076543210 (unknown) 0x5555666677778888
```

and now it prints:

```
0x0000000012345678 (<unknown:>0x12345678) 0x8765432187654321
0x000000006abcdef0 (<unknown:>0x6abcdef0) 0x9988776655443322
0x0000000076543210 (<unknown:>0x76543210) 0x5555666677778888
```

GNU reaedlf prints different thing:

```
0x0000000012345678 (<unknown>: 12345678) 0x8765432187654321
0x000000006abcdef0 (Operating System specific: 6abcdef0) 0x9988776655443322
0x0000000076543210 (Processor Specific: 76543210) 0x5555666677778888
```

I am not sure we want to follow GNU here. Even if we do, it should be separate
patch probably. The new output looks better and closer to GNU anyways,
and the code is a bit simpler.

Differential revision: https://reviews.llvm.org/D71835
  • Loading branch information
Georgii Rymar committed Dec 24, 2019
1 parent c6a5534 commit 301cb91
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 147 deletions.
2 changes: 1 addition & 1 deletion llvm/lib/Object/ELF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch,
#define PPC64_DYNAMIC_TAG(name, value)
// Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
#define DYNAMIC_TAG_MARKER(name, value)
#define DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value)
#define DYNAMIC_TAG(name, value) case value: return #name;
#include "llvm/BinaryFormat/DynamicTags.def"
#undef DYNAMIC_TAG
#undef AARCH64_DYNAMIC_TAG
Expand Down
130 changes: 65 additions & 65 deletions llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test
Original file line number Diff line number Diff line change
Expand Up @@ -66,75 +66,75 @@
# LLVM-NEXT: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [D]
# LLVM-NEXT: 0x000000007FFFFFFE USED Not needed object: [U]
# LLVM-NEXT: 0x000000007FFFFFFF FILTER Filter library: [U]
# LLVM-NEXT: 0x0000000012345678 unknown 0x8765432187654321
# LLVM-NEXT: 0x000000006ABCDEF0 unknown 0x9988776655443322
# LLVM-NEXT: 0x0000000076543210 unknown 0x5555666677778888
# LLVM-NEXT: 0x0000000012345678 <unknown:>0x12345678 0x8765432187654321
# LLVM-NEXT: 0x000000006ABCDEF0 <unknown:>0x6abcdef0 0x9988776655443322
# LLVM-NEXT: 0x0000000076543210 <unknown:>0x76543210 0x5555666677778888
# LLVM-NEXT: 0x0000000000000000 NULL 0x0
# LLVM-NEXT: ]

# GNU: Dynamic section at offset {{.*}} contains 61 entries:
# GNU-NEXT: Tag Type Name/Value
# GNU-NEXT: 0x0000000000000001 (NEEDED) Shared library: [D]
# GNU-NEXT: 0x0000000000000002 (PLTRELSZ) 16 (bytes)
# GNU-NEXT: 0x0000000000000003 (PLTGOT) 0x1000
# GNU-NEXT: 0x0000000000000004 (HASH) 0x1000
# GNU-NEXT: 0x0000000000000005 (STRTAB) 0x1000
# GNU-NEXT: 0x0000000000000006 (SYMTAB) 0x1000
# GNU-NEXT: 0x0000000000000007 (RELA) 0x1000
# GNU-NEXT: 0x0000000000000008 (RELASZ) 16 (bytes)
# GNU-NEXT: 0x0000000000000009 (RELAENT) 1929 (bytes)
# GNU-NEXT: 0x000000000000000a (STRSZ) 16 (bytes)
# GNU-NEXT: 0x000000000000000b (SYMENT) 2439 (bytes)
# GNU-NEXT: 0x000000000000000c (INIT) 0x1000
# GNU-NEXT: 0x000000000000000d (FINI) 0x1000
# GNU-NEXT: 0x000000000000000e (SONAME) Library soname: [U]
# GNU-NEXT: 0x000000000000000f (RPATH) Library rpath: [f]
# GNU-NEXT: 0x0000000000000010 (SYMBOLIC) 0x1234567890abcdef
# GNU-NEXT: 0x0000000000000011 (REL) 0x1000
# GNU-NEXT: 0x0000000000000012 (RELSZ) 16 (bytes)
# GNU-NEXT: 0x0000000000000013 (RELENT) 291 (bytes)
# GNU-NEXT: 0x0000000000000014 (PLTREL) RELA
# GNU-NEXT: 0x0000000000000015 (DEBUG) 0xfedcba0987654321
# GNU-NEXT: 0x0000000000000016 (TEXTREL) 0x1122334455667788
# GNU-NEXT: 0x0000000000000017 (JMPREL) 0x1000
# GNU-NEXT: 0x0000000000000018 (BIND_NOW) 0x8877665544332211
# GNU-NEXT: 0x0000000000000019 (INIT_ARRAY) 0x1000
# GNU-NEXT: 0x000000000000001a (FINI_ARRAY) 0x1000
# GNU-NEXT: 0x000000000000001b (INIT_ARRAYSZ) 16 (bytes)
# GNU-NEXT: 0x000000000000001c (FINI_ARRAYSZ) 16 (bytes)
# GNU-NEXT: 0x000000000000001d (RUNPATH) Library runpath: [w]
# GNU-NEXT: 0x000000000000001e (FLAGS) ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS {{$}}
# GNU-NEXT: 0x0000000000000020 (PREINIT_ARRAY) 0x1000
# GNU-NEXT: 0x0000000000000021 (PREINIT_ARRAYSZ) 16 (bytes)
# GNU-NEXT: 0x0000000000000022 (SYMTAB_SHNDX) 0x1000
# GNU-NEXT: 0x0000000000000023 (RELRSZ) 0x10
# GNU-NEXT: 0x0000000000000024 (RELR) 0x1000
# GNU-NEXT: 0x0000000000000025 (RELRENT) 0x4321
# GNU-NEXT: 0x000000006000000f (ANDROID_REL) 0x1000
# GNU-NEXT: 0x0000000060000010 (ANDROID_RELSZ) 16 (bytes)
# GNU-NEXT: 0x0000000060000011 (ANDROID_RELA) 0x1000
# GNU-NEXT: 0x0000000060000012 (ANDROID_RELASZ) 16 (bytes)
# GNU-NEXT: 0x000000006fffe000 (ANDROID_RELR) 0x1000
# GNU-NEXT: 0x000000006fffe001 (ANDROID_RELRSZ) 0x10
# GNU-NEXT: 0x000000006fffe003 (ANDROID_RELRENT) 0x1234
# GNU-NEXT: 0x000000006ffffef5 (GNU_HASH) 0x1000
# GNU-NEXT: 0x000000006ffffef6 (TLSDESC_PLT) 0x1000
# GNU-NEXT: 0x000000006ffffef7 (TLSDESC_GOT) 0x1000
# GNU-NEXT: 0x000000006ffffff9 (RELACOUNT) 0
# GNU-NEXT: 0x000000006ffffffa (RELCOUNT) 0
# GNU-NEXT: 0x000000006ffffffb (FLAGS_1) NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON {{$}}
# GNU-NEXT: 0x000000006ffffff0 (VERSYM) 0x1000
# GNU-NEXT: 0x000000006ffffffc (VERDEF) 0x1000
# GNU-NEXT: 0x000000006ffffffd (VERDEFNUM) 0
# GNU-NEXT: 0x000000006ffffffe (VERNEED) 0x1000
# GNU-NEXT: 0x000000006fffffff (VERNEEDNUM) 0
# GNU-NEXT: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [D]
# GNU-NEXT: 0x000000007ffffffe (USED) Not needed object: [U]
# GNU-NEXT: 0x000000007fffffff (FILTER) Filter library: [U]
# GNU-NEXT: 0x0000000012345678 (unknown) 0x8765432187654321
# GNU-NEXT: 0x000000006abcdef0 (unknown) 0x9988776655443322
# GNU-NEXT: 0x0000000076543210 (unknown) 0x5555666677778888
# GNU-NEXT: 0x0000000000000000 (NULL) 0x0
# GNU-NEXT: Tag Type Name/Value
# GNU-NEXT: 0x0000000000000001 (NEEDED) Shared library: [D]
# GNU-NEXT: 0x0000000000000002 (PLTRELSZ) 16 (bytes)
# GNU-NEXT: 0x0000000000000003 (PLTGOT) 0x1000
# GNU-NEXT: 0x0000000000000004 (HASH) 0x1000
# GNU-NEXT: 0x0000000000000005 (STRTAB) 0x1000
# GNU-NEXT: 0x0000000000000006 (SYMTAB) 0x1000
# GNU-NEXT: 0x0000000000000007 (RELA) 0x1000
# GNU-NEXT: 0x0000000000000008 (RELASZ) 16 (bytes)
# GNU-NEXT: 0x0000000000000009 (RELAENT) 1929 (bytes)
# GNU-NEXT: 0x000000000000000a (STRSZ) 16 (bytes)
# GNU-NEXT: 0x000000000000000b (SYMENT) 2439 (bytes)
# GNU-NEXT: 0x000000000000000c (INIT) 0x1000
# GNU-NEXT: 0x000000000000000d (FINI) 0x1000
# GNU-NEXT: 0x000000000000000e (SONAME) Library soname: [U]
# GNU-NEXT: 0x000000000000000f (RPATH) Library rpath: [f]
# GNU-NEXT: 0x0000000000000010 (SYMBOLIC) 0x1234567890abcdef
# GNU-NEXT: 0x0000000000000011 (REL) 0x1000
# GNU-NEXT: 0x0000000000000012 (RELSZ) 16 (bytes)
# GNU-NEXT: 0x0000000000000013 (RELENT) 291 (bytes)
# GNU-NEXT: 0x0000000000000014 (PLTREL) RELA
# GNU-NEXT: 0x0000000000000015 (DEBUG) 0xfedcba0987654321
# GNU-NEXT: 0x0000000000000016 (TEXTREL) 0x1122334455667788
# GNU-NEXT: 0x0000000000000017 (JMPREL) 0x1000
# GNU-NEXT: 0x0000000000000018 (BIND_NOW) 0x8877665544332211
# GNU-NEXT: 0x0000000000000019 (INIT_ARRAY) 0x1000
# GNU-NEXT: 0x000000000000001a (FINI_ARRAY) 0x1000
# GNU-NEXT: 0x000000000000001b (INIT_ARRAYSZ) 16 (bytes)
# GNU-NEXT: 0x000000000000001c (FINI_ARRAYSZ) 16 (bytes)
# GNU-NEXT: 0x000000000000001d (RUNPATH) Library runpath: [w]
# GNU-NEXT: 0x000000000000001e (FLAGS) ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS {{$}}
# GNU-NEXT: 0x0000000000000020 (PREINIT_ARRAY) 0x1000
# GNU-NEXT: 0x0000000000000021 (PREINIT_ARRAYSZ) 16 (bytes)
# GNU-NEXT: 0x0000000000000022 (SYMTAB_SHNDX) 0x1000
# GNU-NEXT: 0x0000000000000023 (RELRSZ) 0x10
# GNU-NEXT: 0x0000000000000024 (RELR) 0x1000
# GNU-NEXT: 0x0000000000000025 (RELRENT) 0x4321
# GNU-NEXT: 0x000000006000000f (ANDROID_REL) 0x1000
# GNU-NEXT: 0x0000000060000010 (ANDROID_RELSZ) 16 (bytes)
# GNU-NEXT: 0x0000000060000011 (ANDROID_RELA) 0x1000
# GNU-NEXT: 0x0000000060000012 (ANDROID_RELASZ) 16 (bytes)
# GNU-NEXT: 0x000000006fffe000 (ANDROID_RELR) 0x1000
# GNU-NEXT: 0x000000006fffe001 (ANDROID_RELRSZ) 0x10
# GNU-NEXT: 0x000000006fffe003 (ANDROID_RELRENT) 0x1234
# GNU-NEXT: 0x000000006ffffef5 (GNU_HASH) 0x1000
# GNU-NEXT: 0x000000006ffffef6 (TLSDESC_PLT) 0x1000
# GNU-NEXT: 0x000000006ffffef7 (TLSDESC_GOT) 0x1000
# GNU-NEXT: 0x000000006ffffff9 (RELACOUNT) 0
# GNU-NEXT: 0x000000006ffffffa (RELCOUNT) 0
# GNU-NEXT: 0x000000006ffffffb (FLAGS_1) NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON {{$}}
# GNU-NEXT: 0x000000006ffffff0 (VERSYM) 0x1000
# GNU-NEXT: 0x000000006ffffffc (VERDEF) 0x1000
# GNU-NEXT: 0x000000006ffffffd (VERDEFNUM) 0
# GNU-NEXT: 0x000000006ffffffe (VERNEED) 0x1000
# GNU-NEXT: 0x000000006fffffff (VERNEEDNUM) 0
# GNU-NEXT: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [D]
# GNU-NEXT: 0x000000007ffffffe (USED) Not needed object: [U]
# GNU-NEXT: 0x000000007fffffff (FILTER) Filter library: [U]
# GNU-NEXT: 0x0000000012345678 (<unknown:>0x12345678) 0x8765432187654321
# GNU-NEXT: 0x000000006abcdef0 (<unknown:>0x6abcdef0) 0x9988776655443322
# GNU-NEXT: 0x0000000076543210 (<unknown:>0x76543210) 0x5555666677778888
# GNU-NEXT: 0x0000000000000000 (NULL) 0x0

--- !ELF
FileHeader:
Expand Down
90 changes: 9 additions & 81 deletions llvm/tools/llvm-readobj/ELFDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ template <typename ELFT> class ELFDumper : public ObjDumper {
std::pair<const Elf_Phdr *, const Elf_Shdr *>
findDynamic(const ELFFile<ELFT> *Obj);
void loadDynamicTable(const ELFFile<ELFT> *Obj);
void parseDynamicTable();
void parseDynamicTable(const ELFFile<ELFT> *Obj);

Expected<StringRef> getSymbolVersion(const Elf_Sym *symb,
bool &IsDefault) const;
Expand Down Expand Up @@ -1868,7 +1868,7 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
if (!DynamicPhdr || !DynamicSec) {
if ((DynamicPhdr && IsPhdrTableValid) || (DynamicSec && IsSecTableValid)) {
DynamicTable = DynamicPhdr ? FromPhdr : FromSec;
parseDynamicTable();
parseDynamicTable(Obj);
} else {
reportWarning(createError("no valid dynamic table was found"),
ObjF->getFileName());
Expand Down Expand Up @@ -1909,7 +1909,7 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
DynamicTable = FromSec;
}

parseDynamicTable();
parseDynamicTable(Obj);
}

template <typename ELFT>
Expand Down Expand Up @@ -1975,82 +1975,13 @@ ELFDumper<ELFT>::ELFDumper(const object::ELFObjectFile<ELFT> *ObjF,
ELFDumperStyle.reset(new LLVMStyle<ELFT>(Writer, this));
}

static const char *getTypeString(unsigned Arch, uint64_t Type) {
#define DYNAMIC_TAG(n, v)
switch (Arch) {

case EM_AARCH64:
switch (Type) {
#define AARCH64_DYNAMIC_TAG(name, value) \
case DT_##name: \
return #name;
#include "llvm/BinaryFormat/DynamicTags.def"
#undef AARCH64_DYNAMIC_TAG
}
break;

case EM_HEXAGON:
switch (Type) {
#define HEXAGON_DYNAMIC_TAG(name, value) \
case DT_##name: \
return #name;
#include "llvm/BinaryFormat/DynamicTags.def"
#undef HEXAGON_DYNAMIC_TAG
}
break;

case EM_MIPS:
switch (Type) {
#define MIPS_DYNAMIC_TAG(name, value) \
case DT_##name: \
return #name;
#include "llvm/BinaryFormat/DynamicTags.def"
#undef MIPS_DYNAMIC_TAG
}
break;

case EM_PPC64:
switch (Type) {
#define PPC64_DYNAMIC_TAG(name, value) \
case DT_##name: \
return #name;
#include "llvm/BinaryFormat/DynamicTags.def"
#undef PPC64_DYNAMIC_TAG
}
break;
}
#undef DYNAMIC_TAG
switch (Type) {
// Now handle all dynamic tags except the architecture specific ones
#define AARCH64_DYNAMIC_TAG(name, value)
#define MIPS_DYNAMIC_TAG(name, value)
#define HEXAGON_DYNAMIC_TAG(name, value)
#define PPC64_DYNAMIC_TAG(name, value)
// Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
#define DYNAMIC_TAG_MARKER(name, value)
#define DYNAMIC_TAG(name, value) \
case DT_##name: \
return #name;
#include "llvm/BinaryFormat/DynamicTags.def"
#undef DYNAMIC_TAG
#undef AARCH64_DYNAMIC_TAG
#undef MIPS_DYNAMIC_TAG
#undef HEXAGON_DYNAMIC_TAG
#undef PPC64_DYNAMIC_TAG
#undef DYNAMIC_TAG_MARKER
default:
return "unknown";
}
}

template <typename ELFT> void ELFDumper<ELFT>::parseDynamicTable() {
template <typename ELFT>
void ELFDumper<ELFT>::parseDynamicTable(const ELFFile<ELFT> *Obj) {
auto toMappedAddr = [&](uint64_t Tag, uint64_t VAddr) -> const uint8_t * {
auto MappedAddrOrError = ObjF->getELFFile()->toMappedAddr(VAddr);
if (!MappedAddrOrError) {
Error Err =
createError("Unable to parse DT_" +
Twine(getTypeString(
ObjF->getELFFile()->getHeader()->e_machine, Tag)) +
createError("Unable to parse DT_" + Obj->getDynamicTagAsString(Tag) +
": " + llvm::toString(MappedAddrOrError.takeError()));

reportWarning(std::move(Err), ObjF->getFileName());
Expand Down Expand Up @@ -4061,9 +3992,8 @@ template <class ELFT> void GNUStyle<ELFT>::printDynamic(const ELFO *Obj) {
OS << " Tag Type Name/Value\n";
for (auto Entry : Table) {
uintX_t Tag = Entry.getTag();
std::string TypeString = std::string("(") +
getTypeString(Obj->getHeader()->e_machine, Tag) +
")";
std::string TypeString =
std::string("(") + Obj->getDynamicTagAsString(Tag).c_str() + ")";
OS << " " << format_hex(Tag, Is64 ? 18 : 10)
<< format(" %-20s ", TypeString.c_str());
this->dumper()->printDynamicEntry(OS, Tag, Entry.getVal());
Expand Down Expand Up @@ -5866,12 +5796,10 @@ template <class ELFT> void LLVMStyle<ELFT>::printDynamic(const ELFFile<ELFT> *Ob
for (auto Entry : Table) {
uintX_t Tag = Entry.getTag();
W.startLine() << " " << format_hex(Tag, Is64 ? 18 : 10, true) << " "
<< format("%-21s",
getTypeString(Obj->getHeader()->e_machine, Tag));
<< format("%-21s", Obj->getDynamicTagAsString(Tag).c_str());
this->dumper()->printDynamicEntry(OS, Tag, Entry.getVal());
OS << "\n";
}

W.startLine() << "]\n";
}

Expand Down

0 comments on commit 301cb91

Please sign in to comment.