From 134cf47dcbe7ff4b58bc2001926b412b28138afc Mon Sep 17 00:00:00 2001 From: Joel Galenson Date: Fri, 24 Aug 2018 15:21:57 +0000 Subject: [llvm-objdump] Label calls to the PLT. Differential Revision: https://reviews.llvm.org/D50204 llvm-svn: 340611 --- llvm/tools/llvm-objdump/llvm-objdump.cpp | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp') diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 09fa0c6..68e03d4 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -56,6 +56,7 @@ #include "llvm/Support/InitLLVM.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/SourceMgr.h" +#include "llvm/Support/StringSaver.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/raw_ostream.h" @@ -1235,6 +1236,37 @@ addDynamicElfSymbols(const ObjectFile *Obj, llvm_unreachable("Unsupported binary format"); } +static void addPltEntries(const ObjectFile *Obj, + std::map &AllSymbols, + StringSaver &Saver) { + Optional Plt = None; + for (const SectionRef &Section : Obj->sections()) { + StringRef Name; + if (Section.getName(Name)) + continue; + if (Name == ".plt") + Plt = Section; + } + if (!Plt) + return; + if (auto *ElfObj = dyn_cast(Obj)) { + for (auto PltEntry : ElfObj->getPltAddresses()) { + SymbolRef Symbol(PltEntry.first, ElfObj); + + uint8_t SymbolType = getElfSymbolType(Obj, Symbol); + + Expected NameOrErr = Symbol.getName(); + if (!NameOrErr) + report_error(Obj->getFileName(), NameOrErr.takeError()); + if (NameOrErr->empty()) + continue; + StringRef Name = Saver.save((*NameOrErr + "@plt").str()); + + AllSymbols[*Plt].emplace_back(PltEntry.second, Name, SymbolType); + } + } +} + static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { if (StartAddress > StopAddress) error("Start address should be less than stop address"); @@ -1342,6 +1374,10 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { if (AllSymbols.empty() && Obj->isELF()) addDynamicElfSymbols(Obj, AllSymbols); + BumpPtrAllocator A; + StringSaver Saver(A); + addPltEntries(Obj, AllSymbols, Saver); + // Create a mapping from virtual address to section. std::vector> SectionAddresses; for (SectionRef Sec : Obj->sections()) -- cgit v1.1