summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/ELFDumper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r--llvm/tools/llvm-readobj/ELFDumper.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 2d73c10c070..359e4041825 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -165,6 +165,7 @@ private:
// Dynamic relocation info.
DynRegionInfo DynRelRegion;
DynRegionInfo DynRelaRegion;
+ DynRegionInfo DynPLTRelRegion;
DynRegionInfo DynSymRegion;
StringRef DynamicStringTable;
@@ -1126,6 +1127,21 @@ void ELFDumper<ELFT>::parseDynamicTable(
case ELF::DT_RELENT:
DynRelRegion.EntSize = Dyn.getVal();
break;
+ case ELF::DT_PLTREL:
+ if (Dyn.getVal() == DT_REL)
+ DynPLTRelRegion.EntSize = sizeof(Elf_Rel);
+ else if (Dyn.getVal() == DT_RELA)
+ DynPLTRelRegion.EntSize = sizeof(Elf_Rela);
+ else
+ reportError(Twine("unknown DT_PLTREL value of ") +
+ Twine((uint64_t)Dyn.getVal()));
+ break;
+ case ELF::DT_JMPREL:
+ DynPLTRelRegion.Addr = toMappedAddr(Dyn.getPtr());
+ break;
+ case ELF::DT_PLTRELSZ:
+ DynPLTRelRegion.Size = Dyn.getVal();
+ break;
}
}
if (StringTableBegin)
@@ -1155,6 +1171,7 @@ void ELFDumper<ELFT>::parseDynamicTable(
CheckDRI(DynamicTable);
CheckDRI(DynRelRegion);
CheckDRI(DynRelaRegion);
+ CheckDRI(DynPLTRelRegion);
if (DynamicStringTable.data() >= Start && DynamicStringTable.data() < End)
End = DynamicStringTable.data();
@@ -1310,6 +1327,17 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicRelocations() {
Rela.r_addend = 0;
printDynamicRelocation(Rela);
}
+ if (DynPLTRelRegion.EntSize == sizeof(Elf_Rela))
+ for (const Elf_Rela &Rela : DynPLTRelRegion.getAsRange<Elf_Rela>())
+ printDynamicRelocation(Rela);
+ else
+ for (const Elf_Rel &Rel : DynPLTRelRegion.getAsRange<Elf_Rel>()) {
+ Elf_Rela Rela;
+ Rela.r_offset = Rel.r_offset;
+ Rela.r_info = Rel.r_info;
+ Rela.r_addend = 0;
+ printDynamicRelocation(Rela);
+ }
W.unindent();
W.startLine() << "}\n";
}
OpenPOWER on IntegriCloud