summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorJoel Galenson <jgalenson@google.com>2018-08-24 15:21:57 +0000
committerJoel Galenson <jgalenson@google.com>2018-08-24 15:21:57 +0000
commit134cf47dcbe7ff4b58bc2001926b412b28138afc (patch)
treeb9cf314f6b11111cbb95424de39273878019bb30 /llvm
parentd36fb48a274bd6c53ce289e968be4c53c189e0a7 (diff)
downloadbcm5719-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-aarch64bin0 -> 68360 bytes
-rw-r--r--llvm/test/tools/llvm-objdump/AArch64/plt.test5
-rw-r--r--llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.elf-i386bin0 -> 7248 bytes
-rw-r--r--llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.nopie.elf-i386bin0 -> 7080 bytes
-rw-r--r--llvm/test/tools/llvm-objdump/X86/plt.test14
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp36
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
new file mode 100644
index 00000000000..49142ff8170
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/AArch64/Inputs/cfi.elf-aarch64
Binary files differ
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
new file mode 100644
index 00000000000..b610be65758
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.elf-i386
Binary files differ
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
new file mode 100644
index 00000000000..eadcc739092
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/X86/Inputs/hello.exe.nopie.elf-i386
Binary files differ
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())
OpenPOWER on IntegriCloud