summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/ELFDumper.cpp
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2015-06-25 21:47:32 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2015-06-25 21:47:32 +0000
commit594c028183b92988797f4c169b5e06a06de22ea0 (patch)
tree18ea9ee5ea851b347b3e89f4e4afe7b5e944ec8e /llvm/tools/llvm-readobj/ELFDumper.cpp
parent358cf1ea302ebc9c2f307aa710c22821a4ab670a (diff)
downloadbcm5719-llvm-594c028183b92988797f4c169b5e06a06de22ea0.tar.gz
bcm5719-llvm-594c028183b92988797f4c169b5e06a06de22ea0.zip
[Object][ELF] Add support for dumping dynamic relocations when sections are stripped.
llvm-svn: 240703
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r--llvm/tools/llvm-readobj/ELFDumper.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index d8c089a63e3..3df8ed9f710 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -47,6 +47,7 @@ public:
void printFileHeaders() override;
void printSections() override;
void printRelocations() override;
+ void printDynamicRelocations() override;
void printSymbols() override;
void printDynamicSymbols() override;
void printUnwindInfo() override;
@@ -676,6 +677,39 @@ void ELFDumper<ELFT>::printRelocations() {
}
}
+template<class ELFT>
+void ELFDumper<ELFT>::printDynamicRelocations() {
+ W.startLine() << "Dynamic Relocations {\n";
+ W.indent();
+ for (typename ELFO::Elf_Rela_Iter RelI = Obj->begin_dyn_rela(),
+ RelE = Obj->end_dyn_rela();
+ RelI != RelE; ++RelI) {
+ SmallString<32> RelocName;
+ Obj->getRelocationTypeName(RelI->getType(Obj->isMips64EL()), RelocName);
+ StringRef SymbolName;
+ uint32_t SymIndex = RelI->getSymbol(Obj->isMips64EL());
+ typename ELFO::Elf_Sym_Iter Sym = Obj->begin_dynamic_symbols() + SymIndex;
+ SymbolName = errorOrDefault(Obj->getSymbolName(Sym));
+ if (opts::ExpandRelocs) {
+ DictScope Group(W, "Relocation");
+ W.printHex("Offset", RelI->r_offset);
+ W.printNumber("Type", RelocName, (int)RelI->getType(Obj->isMips64EL()));
+ W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-");
+ W.printHex("Addend", RelI->r_addend);
+ }
+ else {
+ raw_ostream& OS = W.startLine();
+ OS << W.hex(RelI->r_offset)
+ << " " << RelocName
+ << " " << (SymbolName.size() > 0 ? SymbolName : "-")
+ << " " << W.hex(RelI->r_addend)
+ << "\n";
+ }
+ }
+ W.unindent();
+ W.startLine() << "}\n";
+}
+
template <class ELFT>
void ELFDumper<ELFT>::printRelocations(const Elf_Shdr *Sec) {
switch (Sec->sh_type) {
@@ -986,6 +1020,9 @@ static void printValue(const ELFFile<ELFT> *O, uint64_t Type, uint64_t Value,
case DT_FLAGS_1:
printFlags(Value, makeArrayRef(ElfDynamicDTFlags1), OS);
break;
+ default:
+ OS << format("0x%" PRIX64, Value);
+ break;
}
}
OpenPOWER on IntegriCloud