Index: test/tools/llvm-objdump/AArch64/plt.test =================================================================== --- /dev/null +++ test/tools/llvm-objdump/AArch64/plt.test @@ -0,0 +1,5 @@ +// RUN: llvm-objdump -d %p/Inputs/simple-inheritance.elf-aarch64 | FileCheck %s + +# CHECK: Disassembly of section .plt: +# CHECK: _Znwm@plt: +# CHECK: bl {{.*}} <_Znwm@plt> \ No newline at end of file Index: test/tools/llvm-objdump/X86/plt.test =================================================================== --- /dev/null +++ test/tools/llvm-objdump/X86/plt.test @@ -0,0 +1,6 @@ +// RUN: llvm-objdump -d %p/Inputs/stripped-elf.so | FileCheck %s + +# CHECK: Disassembly of section .plt: +# CHECK: __gmon_start__@plt: +# CHECK: __cxa_finalize@plt: +# CHECK: callq {{.*}} <__cxa_finalize@plt> \ No newline at end of file Index: tools/llvm-objdump/llvm-objdump.cpp =================================================================== --- tools/llvm-objdump/llvm-objdump.cpp +++ tools/llvm-objdump/llvm-objdump.cpp @@ -1235,6 +1235,37 @@ llvm_unreachable("Unsupported binary format"); } +static void addPltEntries(const ObjectFile *Obj, + std::map &AllSymbols, + std::vector &PltEntryNames) { + const SectionRef *Plt = + &*find_if(Obj->sections(), [&](const SectionRef &Section) { + StringRef Str; + return !Section.getName(Str) && Str == ".plt"; + }); + 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 Name = Symbol.getName(); + if (!Name) + report_error(Obj->getFileName(), Name.takeError()); + if (Name->empty()) + continue; + + // We need to keep a permanent copy of the new name so the StringRef in + // AllSymbols works. + PltEntryNames.push_back((*Name + "@plt").str()); + + AllSymbols[*Plt].emplace_back(PltEntry.second, PltEntryNames.back(), SymbolType); + } + } +} + static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { if (StartAddress > StopAddress) error("Start address should be less than stop address"); @@ -1342,6 +1373,9 @@ if (AllSymbols.empty() && Obj->isELF()) addDynamicElfSymbols(Obj, AllSymbols); + std::vector PltEntryNames; + addPltEntries(Obj, AllSymbols, PltEntryNames); + // Create a mapping from virtual address to section. std::vector> SectionAddresses; for (SectionRef Sec : Obj->sections())