Index: class-dump/src/CDLCSymbolTable.m |
=================================================================== |
--- class-dump/src/CDLCSymbolTable.m (revision 0) |
+++ class-dump/src/CDLCSymbolTable.m (revision 0) |
@@ -0,0 +1,216 @@ |
+// -*- 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 "CDLCSymbolTable.h" |
+ |
+#include <mach-o/nlist.h> |
+#import "CDMachOFile.h" |
+#import "CDMachO32File.h" |
+#import "CDSymbol.h" |
+#import "CDLCSegment.h" |
+ |
+@implementation CDLCSymbolTable |
+ |
+- (id)initWithDataCursor:(CDDataCursor *)cursor machOFile:(CDMachOFile *)aMachOFile; |
+{ |
+ if ([super initWithDataCursor:cursor machOFile:aMachOFile] == nil) |
+ return nil; |
+ |
+ symtabCommand.cmd = [cursor readInt32]; |
+ symtabCommand.cmdsize = [cursor readInt32]; |
+ |
+ symtabCommand.symoff = [cursor readInt32]; |
+ symtabCommand.nsyms = [cursor readInt32]; |
+ symtabCommand.stroff = [cursor readInt32]; |
+ symtabCommand.strsize = [cursor readInt32]; |
+ |
+ // symoff is at the start of the first section (__pointers) of the __IMPORT segment |
+ // stroff falls within the __LINKEDIT segment |
+#if 0 |
+ NSLog(@"symtab: %08x %08x %08x %08x %08x %08x", |
+ symtabCommand.cmd, symtabCommand.cmdsize, |
+ symtabCommand.symoff, symtabCommand.nsyms, symtabCommand.stroff, symtabCommand.strsize); |
+ NSLog(@"data offset for stroff: %lu", [aMachOFile dataOffsetForAddress:symtabCommand.stroff]); |
+#endif |
+ |
+ symbols = [[NSMutableArray alloc] init]; |
+ baseAddress = 0; |
+ |
+ classSymbols = [[NSMutableDictionary alloc] init]; |
+ |
+ flags.didFindBaseAddress = NO; |
+ flags.didWarnAboutUnfoundBaseAddress = NO; |
+ |
+ return self; |
+} |
+ |
+- (void)dealloc; |
+{ |
+ [symbols release]; |
+ [classSymbols release]; |
+ |
+ [super dealloc]; |
+} |
+ |
+- (uint32_t)cmd; |
+{ |
+ return symtabCommand.cmd; |
+} |
+ |
+- (uint32_t)cmdsize; |
+{ |
+ return symtabCommand.cmdsize; |
+} |
+ |
+#define CD_VM_PROT_RW (VM_PROT_READ|VM_PROT_WRITE) |
+ |
+- (void)loadSymbols; |
+{ |
+ CDDataCursor *cursor; |
+ uint32_t index; |
+ const char *strtab, *ptr; |
+ |
+ for (CDLoadCommand *loadCommand in [nonretained_machOFile loadCommands]) { |
+ if ([loadCommand isKindOfClass:[CDLCSegment class]]) { |
+ CDLCSegment *segment = (CDLCSegment *)loadCommand; |
+ |
+ if (([segment initprot] & CD_VM_PROT_RW) == CD_VM_PROT_RW) { |
+ //NSLog(@"segment... initprot = %08x, addr= %016lx *** r/w", [segment initprot], [segment vmaddr]); |
+ baseAddress = [segment vmaddr]; |
+ flags.didFindBaseAddress = YES; |
+ break; |
+ } |
+ } |
+ } |
+ |
+ |
+ cursor = [[CDDataCursor alloc] initWithData:[nonretained_machOFile data]]; |
+ [cursor setByteOrder:[nonretained_machOFile byteOrder]]; |
+ [cursor setOffset:[nonretained_machOFile offset] + symtabCommand.symoff]; |
+ //NSLog(@"offset= %lu", [cursor offset]); |
+ //NSLog(@"stroff= %lu", symtabCommand.stroff); |
+ //NSLog(@"strsize= %lu", symtabCommand.strsize); |
+ |
+ strtab = [nonretained_machOFile machODataBytes] + symtabCommand.stroff; |
+ |
+ if ([nonretained_machOFile isKindOfClass:[CDMachO32File class]]) { |
+ //NSLog(@"32 bit..."); |
+ //NSLog(@" str table index type sect desc value"); |
+ //NSLog(@" --------------- ---- ---- ---- --------"); |
+ for (index = 0; index < symtabCommand.nsyms; index++) { |
+ struct nlist nlist; |
+ CDSymbol *symbol; |
+ NSString *str; |
+ |
+ nlist.n_un.n_strx = [cursor readInt32]; |
+ nlist.n_type = [cursor readByte]; |
+ nlist.n_sect = [cursor readByte]; |
+ nlist.n_desc = [cursor readInt16]; |
+ nlist.n_value = [cursor readInt32]; |
+#if 0 |
+ NSLog(@"%5u: %08x %02x %02x %04x %08x - %s", |
+ index, nlist.n_un.n_strx, nlist.n_type, nlist.n_sect, nlist.n_desc, nlist.n_value, strtab + nlist.n_un.n_strx); |
+#endif |
+ |
+ ptr = strtab + nlist.n_un.n_strx; |
+ str = [[NSString alloc] initWithBytes:ptr length:strlen(ptr) encoding:NSASCIIStringEncoding]; |
+ |
+ symbol = [[CDSymbol alloc] initWithName:str machOFile:nonretained_machOFile nlist32:nlist]; |
+ [symbols addObject:symbol]; |
+ [symbol release]; |
+ |
+ [str release]; |
+ } |
+ |
+ //NSLog(@"Loaded %lu 32-bit symbols", [symbols count]); |
+ } else { |
+ //NSLog(@" str table index type sect desc value"); |
+ //NSLog(@" --------------- ---- ---- ---- ----------------"); |
+ for (index = 0; index < symtabCommand.nsyms; index++) { |
+ struct nlist_64 nlist; |
+ CDSymbol *symbol; |
+ NSString *str; |
+ |
+ nlist.n_un.n_strx = [cursor readInt32]; |
+ nlist.n_type = [cursor readByte]; |
+ nlist.n_sect = [cursor readByte]; |
+ nlist.n_desc = [cursor readInt16]; |
+ nlist.n_value = [cursor readInt64]; |
+#if 0 |
+ NSLog(@"%5u: %08x %02x %02x %04x %016x - %s", |
+ index, nlist.n_un.n_strx, nlist.n_type, nlist.n_sect, nlist.n_desc, nlist.n_value, strtab + nlist.n_un.n_strx); |
+#endif |
+ ptr = strtab + nlist.n_un.n_strx; |
+ str = [[NSString alloc] initWithBytes:ptr length:strlen(ptr) encoding:NSASCIIStringEncoding]; |
+ |
+ symbol = [[CDSymbol alloc] initWithName:str machOFile:nonretained_machOFile nlist64:nlist]; |
+ [symbols addObject:symbol]; |
+ |
+ if ([str hasPrefix:ObjCClassSymbolPrefix] && [symbol value] != 0) { |
+ NSString *className = [str substringFromIndex:[ObjCClassSymbolPrefix length]]; |
+ [classSymbols setObject:symbol forKey:className]; |
+ } |
+ |
+ [symbol release]; |
+ |
+ [str release]; |
+ } |
+ |
+ //NSLog(@"Loaded %lu 64-bit symbols", [symbols count]); |
+ } |
+ |
+ [cursor release]; |
+ |
+ //NSLog(@"symbols: %@", symbols); |
+} |
+ |
+- (uint32_t)symoff; |
+{ |
+ return symtabCommand.symoff; |
+} |
+ |
+- (uint32_t)nsyms; |
+{ |
+ return symtabCommand.nsyms; |
+} |
+ |
+- (uint32_t)stroff; |
+{ |
+ return symtabCommand.stroff; |
+} |
+ |
+- (uint32_t)strsize; |
+{ |
+ return symtabCommand.strsize; |
+} |
+ |
+- (NSUInteger)baseAddress; |
+{ |
+ if (flags.didFindBaseAddress == NO && flags.didWarnAboutUnfoundBaseAddress == NO) { |
+ fprintf(stderr, "Warning: Couldn't find first read/write segment for base address of relocation entries.\n"); |
+ flags.didWarnAboutUnfoundBaseAddress = YES; |
+ } |
+ |
+ return baseAddress; |
+} |
+ |
+- (NSArray *)symbols; |
+{ |
+ return symbols; |
+} |
+ |
+- (CDSymbol *)symbolForClass:(NSString *)className; |
+{ |
+ return [classSymbols objectForKey:className]; |
+} |
+ |
+- (NSString *)extraDescription; |
+{ |
+ return [NSString stringWithFormat:@"symoff: 0x%08x (%u), nsyms: 0x%08x (%u), stroff: 0x%08x (%u), strsize: 0x%08x (%u)", |
+ symtabCommand.symoff, symtabCommand.symoff, symtabCommand.nsyms, symtabCommand.nsyms, |
+ symtabCommand.stroff, symtabCommand.stroff, symtabCommand.strsize, symtabCommand.strsize]; |
+} |
+ |
+@end |
Property changes on: class-dump/src/CDLCSymbolTable.m |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |