ftp.nice.ch/pub/next/tools/hack/MachOViewer.NIHS.bs.tar.gz#/MachOViewer/Source/MachO2.m

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.