diff options
author | Fangrui Song <i@maskray.me> | 2021-09-28 09:58:27 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2021-09-28 09:58:27 -0700 |
commit | 74a47e54be7992b6ccad36b53b6808a7032607c7 (patch) | |
tree | 2612f6ebf2f970dbbbdf380c174d42e680ecd7e7 /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | ebb3dc08339cd9d5c4204f0a60742514909d5acd (diff) | |
download | llvm-74a47e54be7992b6ccad36b53b6808a7032607c7.zip llvm-74a47e54be7992b6ccad36b53b6808a7032607c7.tar.gz llvm-74a47e54be7992b6ccad36b53b6808a7032607c7.tar.bz2 |
[llvm-objdump] Fix -R display and support ET_EXEC
* Add a newline before `DYNAMIC RELOCATION RECORDS` (see D101796)
* Add the missing `OFFSET TYPE VALUE` line
* Align columns
Note: llvm-readobj/ELFDumper.cpp `loadDynamicTable` has sophisticated PT_DYNAMIC
code which is unavailable in llvm-objdump.
Reviewed By: jhenderson, Higuoxing
Differential Revision: https://reviews.llvm.org/D110595
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 6a9980b..bb4a871 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1774,7 +1774,9 @@ void objdump::printDynamicRelocations(const ObjectFile *Obj) { return; const auto *Elf = dyn_cast<ELFObjectFileBase>(Obj); - if (!Elf || Elf->getEType() != ELF::ET_DYN) { + if (!Elf || !any_of(Elf->sections(), [](const ELFSectionRef Sec) { + return Sec.getType() == ELF::SHT_DYNAMIC; + })) { reportError(Obj->getFileName(), "not a dynamic object"); return; } @@ -1783,7 +1785,12 @@ void objdump::printDynamicRelocations(const ObjectFile *Obj) { if (DynRelSec.empty()) return; - outs() << "DYNAMIC RELOCATION RECORDS\n"; + outs() << "\nDYNAMIC RELOCATION RECORDS\n"; + const uint32_t OffsetPadding = (Obj->getBytesInAddress() > 4 ? 16 : 8); + const uint32_t TypePadding = 24; + outs() << left_justify("OFFSET", OffsetPadding) << ' ' + << left_justify("TYPE", TypePadding) << " VALUE\n"; + StringRef Fmt = Obj->getBytesInAddress() > 4 ? "%016" PRIx64 : "%08" PRIx64; for (const SectionRef &Section : DynRelSec) for (const RelocationRef &Reloc : Section.relocations()) { @@ -1793,8 +1800,8 @@ void objdump::printDynamicRelocations(const ObjectFile *Obj) { Reloc.getTypeName(RelocName); if (Error E = getRelocationValueString(Reloc, ValueStr)) reportError(std::move(E), Obj->getFileName()); - outs() << format(Fmt.data(), Address) << " " << RelocName << " " - << ValueStr << "\n"; + outs() << format(Fmt.data(), Address) << ' ' + << left_justify(RelocName, TypePadding) << ' ' << ValueStr << '\n'; } } |