From f5e04c38cd1eb48ea1cd68bbc7aa59e0d5ad141f Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Sun, 11 May 2014 08:48:09 +0000 Subject: [PATCH] [llvm-readobj] Print values of FLAGS and MIPS_FLAGS dynamic table tags in a human readable form. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208489 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/ELF.h | 1 + .../llvm-readobj/Inputs/dynamic-table-exe.x86 | Bin 0 -> 6555 bytes test/tools/llvm-readobj/dynamic.test | 45 ++++++++++++- tools/llvm-readobj/ELFDumper.cpp | 62 +++++++++++++++++- 4 files changed, 105 insertions(+), 3 deletions(-) create mode 100755 test/tools/llvm-readobj/Inputs/dynamic-table-exe.x86 diff --git a/include/llvm/Support/ELF.h b/include/llvm/Support/ELF.h index a5a45b4b0b2..95df66538e0 100644 --- a/include/llvm/Support/ELF.h +++ b/include/llvm/Support/ELF.h @@ -1666,6 +1666,7 @@ enum { DT_LOPROC = 0x70000000, // Start of processor specific tags. DT_HIPROC = 0x7FFFFFFF, // End of processor specific tags. + DT_GNU_HASH = 0x6FFFFEF5, // Reference to the GNU hash table. DT_RELACOUNT = 0x6FFFFFF9, // ELF32_Rela count. DT_RELCOUNT = 0x6FFFFFFA, // ELF32_Rel count. diff --git a/test/tools/llvm-readobj/Inputs/dynamic-table-exe.x86 b/test/tools/llvm-readobj/Inputs/dynamic-table-exe.x86 new file mode 100755 index 0000000000000000000000000000000000000000..4edbe5869957847fc533472aa3a24f6bcce5dc09 GIT binary patch literal 6555 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 UUbD ElfDynamicDTFlags[] = { + LLVM_READOBJ_DT_FLAG_ENT(DF, ORIGIN), + LLVM_READOBJ_DT_FLAG_ENT(DF, SYMBOLIC), + LLVM_READOBJ_DT_FLAG_ENT(DF, TEXTREL), + LLVM_READOBJ_DT_FLAG_ENT(DF, BIND_NOW), + LLVM_READOBJ_DT_FLAG_ENT(DF, STATIC_TLS) +}; + +static const EnumEntry ElfDynamicDTMipsFlags[] = { + LLVM_READOBJ_DT_FLAG_ENT(RHF, NONE), + LLVM_READOBJ_DT_FLAG_ENT(RHF, QUICKSTART), + LLVM_READOBJ_DT_FLAG_ENT(RHF, NOTPOT), + LLVM_READOBJ_DT_FLAG_ENT(RHS, NO_LIBRARY_REPLACEMENT), + LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_MOVE), + LLVM_READOBJ_DT_FLAG_ENT(RHF, SGI_ONLY), + LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_INIT), + LLVM_READOBJ_DT_FLAG_ENT(RHF, DELTA_C_PLUS_PLUS), + LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_START_INIT), + LLVM_READOBJ_DT_FLAG_ENT(RHF, PIXIE), + LLVM_READOBJ_DT_FLAG_ENT(RHF, DEFAULT_DELAY_LOAD), + LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTART), + LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTARTED), + LLVM_READOBJ_DT_FLAG_ENT(RHF, CORD), + LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_UNRES_UNDEF), + LLVM_READOBJ_DT_FLAG_ENT(RHF, RLD_ORDER_SAFE) +}; + +#undef LLVM_READOBJ_DT_FLAG_ENT + +template +void printFlags(T Value, ArrayRef> Flags, raw_ostream &OS) { + typedef EnumEntry FlagEntry; + typedef SmallVector FlagVector; + FlagVector SetFlags; + + for (const auto &Flag : Flags) { + if (Flag.Value == 0) + continue; + + if ((Value & Flag.Value) == Flag.Value) + SetFlags.push_back(Flag); + } + + for (const auto &Flag : SetFlags) { + OS << Flag.Name << " "; + } +} + template static void printValue(const ELFFile *O, uint64_t Type, uint64_t Value, bool Is64, raw_ostream &OS) { @@ -781,14 +834,15 @@ static void printValue(const ELFFile *O, uint64_t Type, uint64_t Value, case DT_DEBUG: case DT_VERNEED: case DT_VERSYM: + case DT_GNU_HASH: case DT_NULL: - case DT_MIPS_FLAGS: case DT_MIPS_BASE_ADDRESS: case DT_MIPS_GOTSYM: case DT_MIPS_RLD_MAP: case DT_MIPS_PLTGOT: OS << format("0x%" PRIX64, Value); break; + case DT_RELCOUNT: case DT_VERNEEDNUM: case DT_MIPS_RLD_VERSION: case DT_MIPS_LOCAL_GOTNO: @@ -818,6 +872,12 @@ static void printValue(const ELFFile *O, uint64_t Type, uint64_t Value, case DT_RUNPATH: OS << O->getDynamicString(Value); break; + case DT_MIPS_FLAGS: + printFlags(Value, makeArrayRef(ElfDynamicDTMipsFlags), OS); + break; + case DT_FLAGS: + printFlags(Value, makeArrayRef(ElfDynamicDTFlags), OS); + break; } } -- 2.34.1