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.