Teach macho-dump how to dump linkedit_data load commands.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138807 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2011-08-30 18:33:37 +00:00
parent bc6b89ed31
commit 9942acab0a
4 changed files with 45 additions and 1 deletions

View File

@ -137,7 +137,10 @@ namespace macho {
LCT_Symtab = 0x2, LCT_Symtab = 0x2,
LCT_Dysymtab = 0xb, LCT_Dysymtab = 0xb,
LCT_Segment64 = 0x19, LCT_Segment64 = 0x19,
LCT_UUID = 0x1b LCT_UUID = 0x1b,
LCT_CodeSignature = 0x1d,
LCT_SegmentSplitInfo = 0x1e,
LCT_FunctionStarts = 0x26
}; };
/// \brief Load command structure. /// \brief Load command structure.
@ -218,6 +221,13 @@ namespace macho {
uint32_t NumLocalRelocationTableEntries; uint32_t NumLocalRelocationTableEntries;
}; };
struct LinkeditDataLoadCommand {
uint32_t Type;
uint32_t Size;
uint32_t DataOffset;
uint32_t DataSize;
};
/// @} /// @}
/// @name Section Data /// @name Section Data
/// @{ /// @{

View File

@ -150,6 +150,9 @@ public:
void ReadDysymtabLoadCommand( void ReadDysymtabLoadCommand(
const LoadCommandInfo &LCI, const LoadCommandInfo &LCI,
InMemoryStruct<macho::DysymtabLoadCommand> &Res) const; InMemoryStruct<macho::DysymtabLoadCommand> &Res) const;
void ReadLinkeditDataLoadCommand(
const LoadCommandInfo &LCI,
InMemoryStruct<macho::LinkeditDataLoadCommand> &Res) const;
void ReadIndirectSymbolTableEntry( void ReadIndirectSymbolTableEntry(
const macho::DysymtabLoadCommand &DLC, const macho::DysymtabLoadCommand &DLC,
unsigned Index, unsigned Index,

View File

@ -243,6 +243,18 @@ void MachOObject::ReadDysymtabLoadCommand(const LoadCommandInfo &LCI,
ReadInMemoryStruct(*this, Buffer->getBuffer(), LCI.Offset, Res); ReadInMemoryStruct(*this, Buffer->getBuffer(), LCI.Offset, Res);
} }
template<>
void SwapStruct(macho::LinkeditDataLoadCommand &Value) {
SwapValue(Value.Type);
SwapValue(Value.Size);
SwapValue(Value.DataOffset);
SwapValue(Value.DataSize);
}
void MachOObject::ReadLinkeditDataLoadCommand(const LoadCommandInfo &LCI,
InMemoryStruct<macho::LinkeditDataLoadCommand> &Res) const {
ReadInMemoryStruct(*this, Buffer->getBuffer(), LCI.Offset, Res);
}
template<> template<>
void SwapStruct(macho::IndirectSymbolTableEntry &Value) { void SwapStruct(macho::IndirectSymbolTableEntry &Value) {
SwapValue(Value.Index); SwapValue(Value.Index);

View File

@ -310,6 +310,20 @@ static int DumpDysymtabCommand(MachOObject &Obj,
return Res; return Res;
} }
static int DumpLinkeditDataCommand(MachOObject &Obj,
const MachOObject::LoadCommandInfo &LCI) {
InMemoryStruct<macho::LinkeditDataLoadCommand> LLC;
Obj.ReadLinkeditDataLoadCommand(LCI, LLC);
if (!LLC)
return Error("unable to read segment load command");
outs() << " ('dataoff', " << LLC->DataOffset << ")\n"
<< " ('datasize', " << LLC->DataSize << ")\n";
return 0;
}
static int DumpLoadCommand(MachOObject &Obj, unsigned Index) { static int DumpLoadCommand(MachOObject &Obj, unsigned Index) {
const MachOObject::LoadCommandInfo &LCI = Obj.getLoadCommandInfo(Index); const MachOObject::LoadCommandInfo &LCI = Obj.getLoadCommandInfo(Index);
int Res = 0; int Res = 0;
@ -330,6 +344,11 @@ static int DumpLoadCommand(MachOObject &Obj, unsigned Index) {
case macho::LCT_Dysymtab: case macho::LCT_Dysymtab:
Res = DumpDysymtabCommand(Obj, LCI); Res = DumpDysymtabCommand(Obj, LCI);
break; break;
case macho::LCT_CodeSignature:
case macho::LCT_SegmentSplitInfo:
case macho::LCT_FunctionStarts:
Res = DumpLinkeditDataCommand(Obj, LCI);
break;
default: default:
Warning("unknown load command: " + Twine(LCI.Command.Type)); Warning("unknown load command: " + Twine(LCI.Command.Type));
break; break;