|  | // Copyright 2009 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | /* | 
|  | *	Definitions needed for  accessing MACH object headers. | 
|  | */ | 
|  |  | 
|  | typedef struct { | 
|  | uint32	magic;		/* mach magic number identifier */ | 
|  | uint32	cputype;	/* cpu specifier */ | 
|  | uint32	cpusubtype;	/* machine specifier */ | 
|  | uint32	filetype;	/* type of file */ | 
|  | uint32	ncmds;		/* number of load commands */ | 
|  | uint32	sizeofcmds;	/* the size of all the load commands */ | 
|  | uint32	flags;		/* flags */ | 
|  | uint32	reserved;	/* reserved */ | 
|  | } Machhdr; | 
|  |  | 
|  | typedef struct { | 
|  | uint32	type;	/* type of load command */ | 
|  | uint32	size;	/* total size in bytes */ | 
|  | } MachCmd; | 
|  |  | 
|  | typedef struct  { | 
|  | MachCmd	cmd; | 
|  | char		segname[16];	/* segment name */ | 
|  | uint32	vmaddr;		/* memory address of this segment */ | 
|  | uint32	vmsize;		/* memory size of this segment */ | 
|  | uint32	fileoff;	/* file offset of this segment */ | 
|  | uint32	filesize;	/* amount to map from the file */ | 
|  | uint32	maxprot;	/* maximum VM protection */ | 
|  | uint32	initprot;	/* initial VM protection */ | 
|  | uint32	nsects;		/* number of sections in segment */ | 
|  | uint32	flags;		/* flags */ | 
|  | } MachSeg32; /* for 32-bit architectures */ | 
|  |  | 
|  | typedef struct  { | 
|  | MachCmd	cmd; | 
|  | char		segname[16];	/* segment name */ | 
|  | uvlong	vmaddr;		/* memory address of this segment */ | 
|  | uvlong	vmsize;		/* memory size of this segment */ | 
|  | uvlong	fileoff;	/* file offset of this segment */ | 
|  | uvlong	filesize;	/* amount to map from the file */ | 
|  | uint32	maxprot;	/* maximum VM protection */ | 
|  | uint32	initprot;	/* initial VM protection */ | 
|  | uint32	nsects;		/* number of sections in segment */ | 
|  | uint32	flags;		/* flags */ | 
|  | } MachSeg64; /* for 64-bit architectures */ | 
|  |  | 
|  | typedef struct  { | 
|  | MachCmd	cmd; | 
|  | uint32	fileoff;	/* file offset of this segment */ | 
|  | uint32	filesize;	/* amount to map from the file */ | 
|  | } MachSymSeg; | 
|  |  | 
|  | typedef struct  { | 
|  | char		sectname[16];	/* name of this section */ | 
|  | char		segname[16];	/* segment this section goes in */ | 
|  | uint32	addr;		/* memory address of this section */ | 
|  | uint32	size;		/* size in bytes of this section */ | 
|  | uint32	offset;		/* file offset of this section */ | 
|  | uint32	align;		/* section alignment (power of 2) */ | 
|  | uint32	reloff;		/* file offset of relocation entries */ | 
|  | uint32	nreloc;		/* number of relocation entries */ | 
|  | uint32	flags;		/* flags (section type and attributes)*/ | 
|  | uint32	reserved1;	/* reserved (for offset or index) */ | 
|  | uint32	reserved2;	/* reserved (for count or sizeof) */ | 
|  | } MachSect32; /* for 32-bit architectures */ | 
|  |  | 
|  | typedef struct  { | 
|  | char		sectname[16];	/* name of this section */ | 
|  | char		segname[16];	/* segment this section goes in */ | 
|  | uvlong	addr;		/* memory address of this section */ | 
|  | uvlong	size;		/* size in bytes of this section */ | 
|  | uint32	offset;		/* file offset of this section */ | 
|  | uint32	align;		/* section alignment (power of 2) */ | 
|  | uint32	reloff;		/* file offset of relocation entries */ | 
|  | uint32	nreloc;		/* number of relocation entries */ | 
|  | uint32	flags;		/* flags (section type and attributes)*/ | 
|  | uint32	reserved1;	/* reserved (for offset or index) */ | 
|  | uint32	reserved2;	/* reserved (for count or sizeof) */ | 
|  | uint32	reserved3;	/* reserved */ | 
|  | } MachSect64; /* for 64-bit architectures */ | 
|  |  | 
|  | enum { | 
|  | MACH_CPU_TYPE_X86_64 = (1<<24)|7, | 
|  | MACH_CPU_TYPE_X86 = 7, | 
|  | MACH_CPU_SUBTYPE_X86 = 3, | 
|  | MACH_EXECUTABLE_TYPE = 2, | 
|  | MACH_SEGMENT_32 = 1,	/* 32-bit mapped segment */ | 
|  | MACH_SEGMENT_64 = 0x19,	/* 64-bit mapped segment */ | 
|  | MACH_SYMSEG = 3,	/* obsolete gdb symtab, reused by go */ | 
|  | MACH_UNIXTHREAD = 0x5,	/* thread (for stack) */ | 
|  | }; | 
|  |  | 
|  |  | 
|  | #define	MACH64_MAG		((0xcf<<24) | (0xfa<<16) | (0xed<<8) | 0xfe) | 
|  | #define	MACH32_MAG		((0xce<<24) | (0xfa<<16) | (0xed<<8) | 0xfe) |