macho-dump: Add support for dumping dysymtab indirect symbol table.

llvm-svn: 120214
This commit is contained in:
Daniel Dunbar 2010-11-27 13:26:12 +00:00
parent f9c900d3c9
commit c983afc5a1
4 changed files with 45 additions and 1 deletions

View File

@ -220,6 +220,15 @@ namespace macho {
/// @}
/// @name Indirect Symbol Table
/// @{
struct IndirectSymbolTableEntry {
uint32_t Index;
};
/// @}
// See <mach-o/nlist.h>.
enum SymbolTypeType {
STT_Undefined = 0x00,

View File

@ -125,6 +125,10 @@ public:
void ReadDysymtabLoadCommand(
const LoadCommandInfo &LCI,
InMemoryStruct<macho::DysymtabLoadCommand> &Res) const;
void ReadIndirectSymbolTableEntry(
const macho::DysymtabLoadCommand &DLC,
unsigned Index,
InMemoryStruct<macho::IndirectSymbolTableEntry> &Res) const;
/// @}
};

View File

@ -230,3 +230,16 @@ void MachOObject::ReadDysymtabLoadCommand(const LoadCommandInfo &LCI,
InMemoryStruct<macho::DysymtabLoadCommand> &Res) const {
ReadInMemoryStruct(*this, Buffer->getBuffer(), LCI.Offset, Res);
}
template<>
void SwapStruct(macho::IndirectSymbolTableEntry &Value) {
SwapValue(Value.Index);
}
void
MachOObject::ReadIndirectSymbolTableEntry(const macho::DysymtabLoadCommand &DLC,
unsigned Index,
InMemoryStruct<macho::IndirectSymbolTableEntry> &Res) const {
uint64_t Offset = (DLC.IndirectSymbolTableOffset +
Index * sizeof(macho::IndirectSymbolTableEntry));
ReadInMemoryStruct(*this, Buffer->getBuffer(), Offset, Res);
}

View File

@ -14,6 +14,7 @@
#include "llvm/Object/MachOObject.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
@ -154,7 +155,24 @@ static int DumpDysymtabCommand(MachOObject &Obj,
outs() << " ('locreloff', " << DLC->LocalRelocationTableOffset << ")\n";
outs() << " ('nlocrel', " << DLC->NumLocalRelocationTableEntries << ")\n";
return 0;
// Dump the indirect symbol table.
int Res = 0;
outs() << " ('_indirect_symbols', [\n";
for (unsigned i = 0; i != DLC->NumIndirectSymbolTableEntries; ++i) {
InMemoryStruct<macho::IndirectSymbolTableEntry> ISTE;
Obj.ReadIndirectSymbolTableEntry(*DLC, i, ISTE);
if (!ISTE) {
Res = Error("unable to read segment load command");
break;
}
outs() << " # Indirect Symbol " << i << "\n";
outs() << " (('symbol_index', "
<< format("%#x", ISTE->Index) << "),),\n";
}
outs() << " ])\n";
return Res;
}
static int DumpLoadCommand(MachOObject &Obj, unsigned Index) {