Index: include/llvm/Object/ELF.h =================================================================== --- include/llvm/Object/ELF.h +++ include/llvm/Object/ELF.h @@ -114,8 +114,8 @@ SmallVectorImpl &Result) const; uint32_t getRelativeRelocationType() const; - const char *getDynamicTagAsString(unsigned Arch, uint64_t Type) const; - const char *getDynamicTagAsString(uint64_t Type) const; + std::string getDynamicTagAsString(unsigned Arch, uint64_t Type) const; + std::string getDynamicTagAsString(uint64_t Type) const; /// Get the symbol for a given relocation. Expected getRelocationSymbol(const Elf_Rel *Rel, Index: lib/Object/ELF.cpp =================================================================== --- lib/Object/ELF.cpp +++ lib/Object/ELF.cpp @@ -424,7 +424,7 @@ } template -const char *ELFFile::getDynamicTagAsString(unsigned Arch, +std::string ELFFile::getDynamicTagAsString(unsigned Arch, uint64_t Type) const { #define DYNAMIC_STRINGIFY_ENUM(tag, value) \ case value: \ @@ -470,12 +470,12 @@ #undef DYNAMIC_TAG_MARKER #undef DYNAMIC_STRINGIFY_ENUM default: - return "unknown"; + return "0x" + utohexstr(Type, true); } } template -const char *ELFFile::getDynamicTagAsString(uint64_t Type) const { +std::string ELFFile::getDynamicTagAsString(uint64_t Type) const { return getDynamicTagAsString(getHeader()->e_machine, Type); } Index: test/tools/llvm-objdump/elf-dynamic-section.test =================================================================== --- test/tools/llvm-objdump/elf-dynamic-section.test +++ test/tools/llvm-objdump/elf-dynamic-section.test @@ -58,6 +58,7 @@ # CHECK-NEXT: VERNEEDNUM 0x0000000000000000 # CHECK-NEXT: AUXILIARY D # CHECK-NEXT: FILTER U +# CHECK-NEXT: 0x12345678 0x0000000000000001 --- !ELF FileHeader: @@ -188,6 +189,8 @@ Value: 0x1 - Tag: DT_FILTER Value: 0x3 + - Tag: 0x12345678 + Value: 0x1 - Tag: DT_NULL Value: 0x0 ProgramHeaders: Index: tools/llvm-objdump/ELFDump.cpp =================================================================== --- tools/llvm-objdump/ELFDump.cpp +++ tools/llvm-objdump/ELFDump.cpp @@ -176,15 +176,8 @@ if (Dyn.d_tag == ELF::DT_NULL) continue; - StringRef Str = StringRef(Elf->getDynamicTagAsString(Dyn.d_tag)); - - if (Str.empty()) { - std::string HexStr = utohexstr(static_cast(Dyn.d_tag), true); - outs() << format(" 0x%-19s", HexStr.c_str()); - } else { - // We use "-21" in order to match GNU objdump's output. - outs() << format(" %-21s", Str.data()); - } + auto Str = Elf->getDynamicTagAsString(Dyn.d_tag); + outs() << format(" %-21s", Str.c_str()); const char *Fmt = ELFT::Is64Bits ? "0x%016" PRIx64 "\n" : "0x%08" PRIx64 "\n";