diff options
author | Joel Galenson <jgalenson@google.com> | 2018-08-24 15:21:57 +0000 |
---|---|---|
committer | Joel Galenson <jgalenson@google.com> | 2018-08-24 15:21:57 +0000 |
commit | 134cf47dcbe7ff4b58bc2001926b412b28138afc (patch) | |
tree | b9cf314f6b11111cbb95424de39273878019bb30 /llvm | |
parent | d36fb48a274bd6c53ce289e968be4c53c189e0a7 (diff) | |
download | bcm5719-llvm-134cf47dcbe7ff4b58bc2001926b412b28138afc.tar.gz bcm5719-llvm-134cf47dcbe7ff4b58bc2001926b412b28138afc.zip |
[llvm-objdump] Label calls to the PLT.
Differential Revision: https://reviews.llvm.org/D50204
llvm-svn: 340611
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/test/tools/llvm-objdump/AArch64/Inputs/cfi.elf-aarch64 | bin | 0 -> 68360 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-objdump/AArch64/plt.test | 5 | ||||
-rw-r--r-- | llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.elf-i386 | bin | 0 -> 7248 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.nopie.elf-i386 | bin | 0 -> 7080 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-objdump/X86/plt.test | 14 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 36 |
6 files changed, 55 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objdump/AArch64/Inputs/cfi.elf-aarch64 b/llvm/test/tools/llvm-objdump/AArch64/Inputs/cfi.elf-aarch64 Binary files differnew file mode 100644 index 00000000000..49142ff8170 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/AArch64/Inputs/cfi.elf-aarch64 diff --git a/llvm/test/tools/llvm-objdump/AArch64/plt.test b/llvm/test/tools/llvm-objdump/AArch64/plt.test new file mode 100644 index 00000000000..d463a694149 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/AArch64/plt.test @@ -0,0 +1,5 @@ +// RUN: llvm-objdump -d %p/Inputs/cfi.elf-aarch64 | FileCheck %s + +# CHECK: Disassembly of section .plt: +# CHECK: __cfi_slowpath@plt: +# CHECK: bl {{.*}} <__cfi_slowpath@plt> diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.elf-i386 b/llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.elf-i386 Binary files differnew file mode 100644 index 00000000000..b610be65758 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.elf-i386 diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.nopie.elf-i386 b/llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.nopie.elf-i386 Binary files differnew file mode 100644 index 00000000000..eadcc739092 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.nopie.elf-i386 diff --git a/llvm/test/tools/llvm-objdump/X86/plt.test b/llvm/test/tools/llvm-objdump/X86/plt.test new file mode 100644 index 00000000000..db3e4e790f5 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/plt.test @@ -0,0 +1,14 @@ +// RUN: llvm-objdump -d %p/Inputs/stripped-elf.so | FileCheck -check-prefix=64 %s +// RUN: llvm-objdump -d %p/Inputs/hello.exe.elf-i386 | FileCheck -check-prefix=32 %s +// RUN: llvm-objdump -d %p/Inputs/hello.exe.nopie.elf-i386 | FileCheck -check-prefix=32 %s + +# 64: Disassembly of section .plt: +# 64: __gmon_start__@plt: +# 64: __cxa_finalize@plt: +# 64: callq {{.*}} <__cxa_finalize@plt> + +# 32: Disassembly of section .plt: +# 32: puts@plt: +# 32: __libc_start_main@plt: +# 32: calll {{.*}} <puts@plt> +# 32: calll {{.*}} <__libc_start_main@plt> diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 09fa0c6fff8..68e03d474b2 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<SectionRef, SectionSymbolsTy> &AllSymbols, + StringSaver &Saver) { + Optional<SectionRef> 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<ELFObjectFileBase>(Obj)) { + for (auto PltEntry : ElfObj->getPltAddresses()) { + SymbolRef Symbol(PltEntry.first, ElfObj); + + uint8_t SymbolType = getElfSymbolType(Obj, Symbol); + + Expected<StringRef> 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<std::pair<uint64_t, SectionRef>> SectionAddresses; for (SectionRef Sec : Obj->sections()) |