This is MachO2.m in view mode; [Download] [Up]
#import <MachOFile.h>
/*
* $Log: MachO2.m,v $
Revision 1.1 94/02/07 21:36:18 ediger
Initial revision
*/
static char rcsident[] = "$Id: MachO2.m,v 1.1 94/02/07 21:36:18 ediger Exp Locker: ediger $";
void print_segments(id mach_o_file);
void print_threads(id oFile);
extern struct mach_header _mh_execute_header;
int
main(int ac, char **av)
{
MachOFile *oFile;
char buf[256];
puts("Hit return to continue...");
gets(buf);
oFile = [[MachOFile alloc] init];
[oFile considerMappedFiles];
printf("address of header: 0x%x\n", &_mh_execute_header);
[oFile fillFromAddress:(char *)&_mh_execute_header];
print_threads(oFile);
print_segments(oFile);
[oFile free];
puts("Hit return to finish...");
gets(buf);
return 0;
}
void
print_threads(oFile)
id oFile;
{
int iThreads, iCC;
iThreads = [oFile threads];
for (iCC = 0; iCC < iThreads; ++iCC)
{ id oThread = [oFile thread:iCC];
unsigned long ulAddr = [oThread pc];
printf("Thread's pc: 0x%lx\n", ulAddr);
}
}
void
print_segments(oFile)
id oFile;
{
int iSegments, iCC;
iSegments = [oFile mappedSegments];
for (iCC = 0; iCC < iSegments; ++iCC)
{ id oSegment = [oFile mappedSegment:iCC];
int iSections;
if ((iSections = [oSegment numberOfSections]) > 0)
{ int iC;
for (iC = 0; iC < iSections; ++iC)
{ struct section *sect = [oSegment getSection:iC];
printf("\t%s in seg %s - 0x%lx, %lu bytes\n",
sect->sectname, sect->segname,
sect->addr, sect->size);
}
}
printf("Segment 0x%lx => 0x%lx named \"%s\"\n",
[oSegment getBaseAddress],
[oSegment getUpperAddress],
[oSegment commandName]);
}
return;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.