diff options
Diffstat (limited to 'llvm/tools/llvm-objdump/ELFDump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/ELFDump.cpp | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp index abfe08346bbd7..602bc63882527 100644 --- a/llvm/tools/llvm-objdump/ELFDump.cpp +++ b/llvm/tools/llvm-objdump/ELFDump.cpp @@ -11,6 +11,8 @@ /// //===----------------------------------------------------------------------===// +#include "ELFDump.h" + #include "llvm-objdump.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Object/ELFObjectFile.h" @@ -18,9 +20,10 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" +using namespace llvm; using namespace llvm::object; +using namespace llvm::objdump; -namespace llvm { template <class ELFT> static Expected<StringRef> getDynamicStrTab(const ELFFile<ELFT> *Elf) { auto DynamicEntriesOrError = Elf->dynamicEntries(); @@ -98,7 +101,7 @@ static Error getRelocationValueString(const ELFObjectFile<ELFT> *Obj, if (!SymName) return SymName.takeError(); if (Demangle) - Fmt << demangle(*SymName); + Fmt << demangle(std::string(*SymName)); else Fmt << *SymName; } @@ -116,9 +119,9 @@ static Error getRelocationValueString(const ELFObjectFile<ELFT> *Obj, return Error::success(); } -Error getELFRelocationValueString(const ELFObjectFileBase *Obj, - const RelocationRef &Rel, - SmallVectorImpl<char> &Result) { +Error objdump::getELFRelocationValueString(const ELFObjectFileBase *Obj, + const RelocationRef &Rel, + SmallVectorImpl<char> &Result) { if (auto *ELF32LE = dyn_cast<ELF32LEObjectFile>(Obj)) return getRelocationValueString(ELF32LE, Rel, Result); if (auto *ELF64LE = dyn_cast<ELF64LEObjectFile>(Obj)) @@ -147,7 +150,7 @@ static uint64_t getSectionLMA(const ELFFile<ELFT> *Obj, return Sec.getAddress(); } -uint64_t getELFSectionLMA(const object::ELFSectionRef &Sec) { +uint64_t objdump::getELFSectionLMA(const object::ELFSectionRef &Sec) { if (const auto *ELFObj = dyn_cast<ELF32LEObjectFile>(Sec.getObject())) return getSectionLMA(ELFObj->getELFFile(), Sec); else if (const auto *ELFObj = dyn_cast<ELF32BEObjectFile>(Sec.getObject())) @@ -159,16 +162,23 @@ uint64_t getELFSectionLMA(const object::ELFSectionRef &Sec) { } template <class ELFT> -void printDynamicSection(const ELFFile<ELFT> *Elf, StringRef Filename) { +static void printDynamicSection(const ELFFile<ELFT> *Elf, StringRef Filename) { ArrayRef<typename ELFT::Dyn> DynamicEntries = unwrapOrError(Elf->dynamicEntries(), Filename); + + // Find the maximum tag name length to format the value column properly. + size_t MaxLen = 0; + for (const typename ELFT::Dyn &Dyn : DynamicEntries) + MaxLen = std::max(MaxLen, Elf->getDynamicTagAsString(Dyn.d_tag).size()); + std::string TagFmt = " %-" + std::to_string(MaxLen) + "s "; + outs() << "Dynamic Section:\n"; for (const typename ELFT::Dyn &Dyn : DynamicEntries) { if (Dyn.d_tag == ELF::DT_NULL) continue; std::string Str = Elf->getDynamicTagAsString(Dyn.d_tag); - outs() << format(" %-21s", Str.c_str()); + outs() << format(TagFmt.c_str(), Str.c_str()); const char *Fmt = ELFT::Is64Bits ? "0x%016" PRIx64 "\n" : "0x%08" PRIx64 "\n"; @@ -188,11 +198,17 @@ void printDynamicSection(const ELFFile<ELFT> *Elf, StringRef Filename) { } } -template <class ELFT> void printProgramHeaders(const ELFFile<ELFT> *o) { +template <class ELFT> +static void printProgramHeaders(const ELFFile<ELFT> *Obj, StringRef FileName) { outs() << "Program Header:\n"; - auto ProgramHeaderOrError = o->program_headers(); - if (!ProgramHeaderOrError) - report_fatal_error(toString(ProgramHeaderOrError.takeError())); + auto ProgramHeaderOrError = Obj->program_headers(); + if (!ProgramHeaderOrError) { + reportWarning("unable to read program headers: " + + toString(ProgramHeaderOrError.takeError()), + FileName); + return; + } + for (const typename ELFT::Phdr &Phdr : *ProgramHeaderOrError) { switch (Phdr.p_type) { case ELF::PT_DYNAMIC: @@ -255,8 +271,8 @@ template <class ELFT> void printProgramHeaders(const ELFFile<ELFT> *o) { } template <class ELFT> -void printSymbolVersionDependency(ArrayRef<uint8_t> Contents, - StringRef StrTab) { +static void printSymbolVersionDependency(ArrayRef<uint8_t> Contents, + StringRef StrTab) { outs() << "Version References:\n"; const uint8_t *Buf = Contents.data(); @@ -280,9 +296,9 @@ void printSymbolVersionDependency(ArrayRef<uint8_t> Contents, } template <class ELFT> -void printSymbolVersionDefinition(const typename ELFT::Shdr &Shdr, - ArrayRef<uint8_t> Contents, - StringRef StrTab) { +static void printSymbolVersionDefinition(const typename ELFT::Shdr &Shdr, + ArrayRef<uint8_t> Contents, + StringRef StrTab) { outs() << "Version definitions:\n"; const uint8_t *Buf = Contents.data(); @@ -312,7 +328,8 @@ void printSymbolVersionDefinition(const typename ELFT::Shdr &Shdr, } template <class ELFT> -void printSymbolVersionInfo(const ELFFile<ELFT> *Elf, StringRef FileName) { +static void printSymbolVersionInfo(const ELFFile<ELFT> *Elf, + StringRef FileName) { ArrayRef<typename ELFT::Shdr> Sections = unwrapOrError(Elf->sections(), FileName); for (const typename ELFT::Shdr &Shdr : Sections) { @@ -333,18 +350,18 @@ void printSymbolVersionInfo(const ELFFile<ELFT> *Elf, StringRef FileName) { } } -void printELFFileHeader(const object::ObjectFile *Obj) { +void objdump::printELFFileHeader(const object::ObjectFile *Obj) { if (const auto *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) - printProgramHeaders(ELFObj->getELFFile()); + printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) - printProgramHeaders(ELFObj->getELFFile()); + printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj)) - printProgramHeaders(ELFObj->getELFFile()); + printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) - printProgramHeaders(ELFObj->getELFFile()); + printProgramHeaders(ELFObj->getELFFile(), Obj->getFileName()); } -void printELFDynamicSection(const object::ObjectFile *Obj) { +void objdump::printELFDynamicSection(const object::ObjectFile *Obj) { if (const auto *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) printDynamicSection(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) @@ -355,7 +372,7 @@ void printELFDynamicSection(const object::ObjectFile *Obj) { printDynamicSection(ELFObj->getELFFile(), Obj->getFileName()); } -void printELFSymbolVersionInfo(const object::ObjectFile *Obj) { +void objdump::printELFSymbolVersionInfo(const object::ObjectFile *Obj) { if (const auto *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) printSymbolVersionInfo(ELFObj->getELFFile(), Obj->getFileName()); else if (const auto *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) @@ -365,4 +382,3 @@ void printELFSymbolVersionInfo(const object::ObjectFile *Obj) { else if (const auto *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) printSymbolVersionInfo(ELFObj->getELFFile(), Obj->getFileName()); } -} // namespace llvm |