| Index: class-dump/src/CDLoadCommand.m
|
| ===================================================================
|
| --- class-dump/src/CDLoadCommand.m (revision 0)
|
| +++ class-dump/src/CDLoadCommand.m (revision 0)
|
| @@ -0,0 +1,195 @@
|
| +// -*- mode: ObjC -*-
|
| +
|
| +// This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files.
|
| +// Copyright (C) 1997-1998, 2000-2001, 2004-2010 Steve Nygard.
|
| +
|
| +#import "CDLoadCommand.h"
|
| +
|
| +#import "CDLCDyldInfo.h"
|
| +#import "CDLCDylib.h"
|
| +#import "CDLCDylinker.h"
|
| +#import "CDLCDynamicSymbolTable.h"
|
| +#import "CDLCEncryptionInfo.h"
|
| +#import "CDLCLinkeditData.h"
|
| +#import "CDLCPrebindChecksum.h"
|
| +#import "CDLCPreboundDylib.h"
|
| +#import "CDLCRoutines32.h"
|
| +#import "CDLCRoutines64.h"
|
| +#import "CDLCRunPath.h"
|
| +#import "CDLCSegment32.h"
|
| +#import "CDLCSegment64.h"
|
| +#import "CDLCSubClient.h"
|
| +#import "CDLCSubFramework.h"
|
| +#import "CDLCSubLibrary.h"
|
| +#import "CDLCSubUmbrella.h"
|
| +#import "CDLCSymbolTable.h"
|
| +#import "CDLCTwoLevelHints.h"
|
| +#import "CDLCUnixThread.h"
|
| +#import "CDLCUUID.h"
|
| +#import "CDLCUnknown.h"
|
| +#import "CDMachOFile.h"
|
| +
|
| +@implementation CDLoadCommand
|
| +
|
| +//+ (id)loadCommandWithPointer:(const void *)ptr machOFile:(CDMachOFile *)aMachOFile;
|
| ++ (id)loadCommandWithDataCursor:(CDDataCursor *)cursor machOFile:(CDMachOFile *)aMachOFile;
|
| +{
|
| + Class targetClass = [CDLCUnknown class];
|
| + unsigned int val;
|
| +
|
| + val = [cursor peekInt32];
|
| +
|
| + switch (val) {
|
| + case LC_SEGMENT: targetClass = [CDLCSegment32 class]; break;
|
| + case LC_SYMTAB: targetClass = [CDLCSymbolTable class]; break;
|
| + //case LC_SYMSEG: // obsolete
|
| + //case LC_THREAD: // not used?
|
| + case LC_UNIXTHREAD: targetClass = [CDLCUnixThread class]; break;
|
| + //case LC_LOADFVMLIB: // not used?
|
| + //case LC_IDFVMLIB: // not used?
|
| + //case LC_IDENT: // not used?
|
| + //case LC_FVMFILE: // not used?
|
| + //case LC_PREPAGE: // not used
|
| + case LC_DYSYMTAB: targetClass = [CDLCDynamicSymbolTable class]; break;
|
| + case LC_LOAD_DYLIB: targetClass = [CDLCDylib class]; break;
|
| + case LC_ID_DYLIB: targetClass = [CDLCDylib class]; break;
|
| + case LC_LOAD_DYLINKER: targetClass = [CDLCDylinker class]; break;
|
| + case LC_ID_DYLINKER: targetClass = [CDLCDylinker class]; break;
|
| + case LC_PREBOUND_DYLIB: targetClass = [CDLCPreboundDylib class]; break;
|
| + case LC_ROUTINES: targetClass = [CDLCRoutines32 class]; break;
|
| + case LC_SUB_FRAMEWORK: targetClass = [CDLCSubFramework class]; break;
|
| + //case LC_SUB_UMBRELLA: targetClass = [CDLCSubUmbrella class]; break;
|
| + case LC_SUB_CLIENT: targetClass = [CDLCSubClient class]; break;
|
| + //case LC_SUB_LIBRARY: targetClass = [CDLCSubLibrary class]; break;
|
| + case LC_TWOLEVEL_HINTS: targetClass = [CDLCTwoLevelHints class]; break;
|
| + case LC_PREBIND_CKSUM: targetClass = [CDLCPrebindChecksum class]; break;
|
| + case LC_LOAD_WEAK_DYLIB: targetClass = [CDLCDylib class]; break;
|
| + case LC_SEGMENT_64: targetClass = [CDLCSegment64 class]; break;
|
| + case LC_ROUTINES_64: targetClass = [CDLCRoutines64 class]; break;
|
| + case LC_UUID: targetClass = [CDLCUUID class]; break;
|
| + case LC_RPATH: targetClass = [CDLCRunPath class]; break;
|
| + case LC_CODE_SIGNATURE: targetClass = [CDLCLinkeditData class]; break;
|
| + case LC_SEGMENT_SPLIT_INFO: targetClass = [CDLCLinkeditData class]; break;
|
| + case LC_REEXPORT_DYLIB: targetClass = [CDLCDylib class]; break;
|
| + //case LC_LAZY_LOAD_DYLIB: targetClass = [CDLCDylib class]; break;
|
| + case LC_ENCRYPTION_INFO: targetClass = [CDLCEncryptionInfo class]; break;
|
| + case LC_DYLD_INFO: targetClass = [CDLCDyldInfo class]; break;
|
| + case LC_DYLD_INFO_ONLY: targetClass = [CDLCDyldInfo class]; break;
|
| +
|
| + default:
|
| + NSLog(@"Unknown load command: 0x%08x", val);
|
| + };
|
| +
|
| + //NSLog(@"targetClass: %@", NSStringFromClass(targetClass));
|
| +
|
| + return [[[targetClass alloc] initWithDataCursor:cursor machOFile:aMachOFile] autorelease];
|
| +}
|
| +
|
| +- (id)initWithDataCursor:(CDDataCursor *)cursor machOFile:(CDMachOFile *)aMachOFile;
|
| +{
|
| + if ([super init] == nil)
|
| + return nil;
|
| +
|
| + nonretained_machOFile = aMachOFile;
|
| + commandOffset = [cursor offset];
|
| +
|
| + return self;
|
| +}
|
| +
|
| +- (CDMachOFile *)machOFile;
|
| +{
|
| + return nonretained_machOFile;
|
| +}
|
| +
|
| +- (NSUInteger)commandOffset;
|
| +{
|
| + return commandOffset;
|
| +}
|
| +
|
| +- (uint32_t)cmd;
|
| +{
|
| + // Implement in subclasses
|
| + [NSException raise:NSGenericException format:@"Must implement method in subclasses."];
|
| + return 0;
|
| +}
|
| +
|
| +- (uint32_t)cmdsize;
|
| +{
|
| + // Implement in subclasses
|
| + [NSException raise:NSGenericException format:@"Must implement method in subclasses."];
|
| + return 0;
|
| +}
|
| +
|
| +- (NSString *)commandName;
|
| +{
|
| + switch ([self cmd]) {
|
| + case LC_SEGMENT: return @"LC_SEGMENT";
|
| + case LC_SYMTAB: return @"LC_SYMTAB";
|
| + case LC_SYMSEG: return @"LC_SYMSEG";
|
| + case LC_THREAD: return @"LC_THREAD";
|
| + case LC_UNIXTHREAD: return @"LC_UNIXTHREAD";
|
| + case LC_LOADFVMLIB: return @"LC_LOADFVMLIB";
|
| + case LC_IDFVMLIB: return @"LC_IDFVMLIB";
|
| + case LC_IDENT: return @"LC_IDENT";
|
| + case LC_FVMFILE: return @"LC_FVMFILE";
|
| + case LC_PREPAGE: return @"LC_PREPAGE";
|
| + case LC_DYSYMTAB: return @"LC_DYSYMTAB";
|
| + case LC_LOAD_DYLIB: return @"LC_LOAD_DYLIB";
|
| + case LC_ID_DYLIB: return @"LC_ID_DYLIB";
|
| + case LC_LOAD_DYLINKER: return @"LC_LOAD_DYLINKER";
|
| + case LC_ID_DYLINKER: return @"LC_ID_DYLINKER";
|
| + case LC_PREBOUND_DYLIB: return @"LC_PREBOUND_DYLIB";
|
| + case LC_ROUTINES: return @"LC_ROUTINES";
|
| + case LC_SUB_FRAMEWORK: return @"LC_SUB_FRAMEWORK";
|
| + case LC_SUB_UMBRELLA: return @"LC_SUB_UMBRELLA";
|
| + case LC_SUB_CLIENT: return @"LC_SUB_CLIENT";
|
| + case LC_SUB_LIBRARY: return @"LC_SUB_LIBRARY";
|
| + case LC_TWOLEVEL_HINTS: return @"LC_TWOLEVEL_HINTS";
|
| + case LC_PREBIND_CKSUM: return @"LC_PREBIND_CKSUM";
|
| +
|
| + case LC_LOAD_WEAK_DYLIB: return @"LC_LOAD_WEAK_DYLIB";
|
| + case LC_SEGMENT_64: return @"LC_SEGMENT_64";
|
| + case LC_ROUTINES_64: return @"LC_ROUTINES_64";
|
| + case LC_UUID: return @"LC_UUID";
|
| + case LC_RPATH: return @"LC_RPATH";
|
| + case LC_CODE_SIGNATURE: return @"LC_CODE_SIGNATURE";
|
| + case LC_SEGMENT_SPLIT_INFO: return @"LC_SEGMENT_SPLIT_INFO";
|
| + case LC_REEXPORT_DYLIB: return @"LC_REEXPORT_DYLIB";
|
| + case LC_LAZY_LOAD_DYLIB: return @"LC_LAZY_LOAD_DYLIB";
|
| + case LC_ENCRYPTION_INFO: return @"LC_ENCRYPTION_INFO";
|
| + case LC_DYLD_INFO: return @"LC_DYLD_INFO";
|
| + case LC_DYLD_INFO_ONLY: return @"LC_DYLD_INFO_ONLY";
|
| + default:
|
| + break;
|
| + }
|
| +
|
| + return [NSString stringWithFormat:@"0x%08x", [self cmd]];
|
| +}
|
| +
|
| +- (NSString *)description;
|
| +{
|
| + return [NSString stringWithFormat:@"<%@:%p> cmd: 0x%08x (%@), cmdsize: %d // %@",
|
| + NSStringFromClass([self class]), self,
|
| + [self cmd], [self commandName], [self cmdsize], [self extraDescription]];
|
| +}
|
| +
|
| +- (NSString *)extraDescription;
|
| +{
|
| + return @"";
|
| +}
|
| +
|
| +- (void)appendToString:(NSMutableString *)resultString verbose:(BOOL)isVerbose;
|
| +{
|
| + [resultString appendFormat:@" cmd %@", [self commandName]];
|
| + if ([self mustUnderstandToExecute])
|
| + [resultString appendFormat:@" (must understand to execute)"];
|
| + [resultString appendFormat:@"\n"];
|
| + [resultString appendFormat:@" cmdsize %u\n", [self cmdsize]];
|
| +}
|
| +
|
| +- (BOOL)mustUnderstandToExecute;
|
| +{
|
| + return ([self cmd] & LC_REQ_DYLD) != 0;
|
| +}
|
| +
|
| +@end
|
|
|
| Property changes on: class-dump/src/CDLoadCommand.m
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|