From e308b8edabccd2c67f9dfc001fc000d056c4c502 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sat, 27 Nov 2010 13:58:16 +0000 Subject: [PATCH] macho-dump: Add support for --dump-section-data and tweak a few format strings. llvm-svn: 120219 --- llvm/include/llvm/Object/MachOObject.h | 2 ++ llvm/lib/Object/MachOObject.cpp | 4 ++++ llvm/tools/macho-dump/macho-dump.cpp | 24 +++++++++++++++++++----- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm/Object/MachOObject.h b/llvm/include/llvm/Object/MachOObject.h index 6c0a1d0cad0f..03d9c147b413 100644 --- a/llvm/include/llvm/Object/MachOObject.h +++ b/llvm/include/llvm/Object/MachOObject.h @@ -102,6 +102,8 @@ public: return Is64Bit ? macho::Header64Size : macho::Header32Size; } + StringRef getData(size_t Offset, size_t Size) const; + /// @} /// @name String Table Data /// @{ diff --git a/llvm/lib/Object/MachOObject.cpp b/llvm/lib/Object/MachOObject.cpp index 33890f6617a6..1051ce27fa0d 100644 --- a/llvm/lib/Object/MachOObject.cpp +++ b/llvm/lib/Object/MachOObject.cpp @@ -125,6 +125,10 @@ MachOObject *MachOObject::LoadFromBuffer(MemoryBuffer *Buffer, return Object.take(); } +StringRef MachOObject::getData(size_t Offset, size_t Size) const { + return Buffer->getBuffer().substr(Offset,Size); +} + void MachOObject::RegisterStringTable(macho::SymtabLoadCommand &SLC) { HasStringTable = true; StringTable = Buffer->getBuffer().substr(SLC.StringTableOffset, diff --git a/llvm/tools/macho-dump/macho-dump.cpp b/llvm/tools/macho-dump/macho-dump.cpp index abe06f4f4dc6..02fa36680f8a 100644 --- a/llvm/tools/macho-dump/macho-dump.cpp +++ b/llvm/tools/macho-dump/macho-dump.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Object/MachOObject.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Format.h" @@ -101,7 +102,7 @@ static int DumpSectionData(MachOObject &Obj, unsigned Index, StringRef Name, outs() << " ('alignment', " << Align << ")\n"; outs() << " ('reloc_offset', " << RelocationTableOffset << ")\n"; outs() << " ('num_reloc', " << NumRelocationTableEntries << ")\n"; - outs() << " ('flags', " << format("%#x", Flags) << ")\n"; + outs() << " ('flags', " << format("0x%x", Flags) << ")\n"; outs() << " ('reserved1', " << Reserved1 << ")\n"; outs() << " ('reserved2', " << Reserved2 << ")\n"; if (Reserved3 != ~0ULL) @@ -120,11 +121,24 @@ static int DumpSectionData(MachOObject &Obj, unsigned Index, StringRef Name, } outs() << " # Relocation " << i << "\n"; - outs() << " (('word-0', " << format("%#x", RE->Word0) << "),\n"; - outs() << " ('word-1', " << format("%#x", RE->Word1) << ")),\n"; + outs() << " (('word-0', " << format("0x%x", RE->Word0) << "),\n"; + outs() << " ('word-1', " << format("0x%x", RE->Word1) << ")),\n"; } outs() << " ])\n"; + // Dump the section data, if requested. + if (ShowSectionData) { + outs() << " ('_section_data', '"; + StringRef Data = Obj.getData(Offset, Size); + for (unsigned i = 0; i != Data.size(); ++i) { + if (i && (i % 4) == 0) + outs() << ' '; + outs() << hexdigit((Data[i] >> 4) & 0xF, /*LowerCase=*/true); + outs() << hexdigit((Data[i] >> 0) & 0xF, /*LowerCase=*/true); + } + outs() << "')\n"; + } + return Res; } @@ -207,7 +221,7 @@ static void DumpSymbolTableEntryData(MachOObject &Obj, uint16_t Flags, uint64_t Value) { outs() << " # Symbol " << Index << "\n"; outs() << " (('n_strx', " << StringIndex << ")\n"; - outs() << " ('n_type', " << format("%#x", Type) << ")\n"; + outs() << " ('n_type', " << format("0x%x", Type) << ")\n"; outs() << " ('n_sect', " << uint32_t(SectionIndex) << ")\n"; outs() << " ('n_desc', " << Flags << ")\n"; outs() << " ('n_value', " << Value << ")\n"; @@ -307,7 +321,7 @@ static int DumpDysymtabCommand(MachOObject &Obj, outs() << " # Indirect Symbol " << i << "\n"; outs() << " (('symbol_index', " - << format("%#x", ISTE->Index) << "),),\n"; + << format("0x%x", ISTE->Index) << "),),\n"; } outs() << " ])\n";