| // 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) |