|  | typedef struct Macho Macho; | 
|  | typedef struct MachoCmd MachoCmd; | 
|  | typedef struct MachoSeg MachoSeg; | 
|  | typedef struct MachoSect MachoSect; | 
|  | typedef struct MachoRel MachoRel; | 
|  | typedef struct MachoSymtab MachoSymtab; | 
|  | typedef struct MachoSym MachoSym; | 
|  | typedef struct MachoDysymtab MachoDysymtab; | 
|  |  | 
|  | enum | 
|  | { | 
|  | MachoCpuVax = 1, | 
|  | MachoCpu68000 = 6, | 
|  | MachoCpu386 = 7, | 
|  | MachoCpuAmd64 = 0x1000007, | 
|  | MachoCpuMips = 8, | 
|  | MachoCpu98000 = 10, | 
|  | MachoCpuHppa = 11, | 
|  | MachoCpuArm = 12, | 
|  | MachoCpu88000 = 13, | 
|  | MachoCpuSparc = 14, | 
|  | MachoCpu860 = 15, | 
|  | MachoCpuAlpha = 16, | 
|  | MachoCpuPower = 18, | 
|  |  | 
|  | MachoCmdSegment = 1, | 
|  | MachoCmdSymtab = 2, | 
|  | MachoCmdSymseg = 3, | 
|  | MachoCmdThread = 4, | 
|  | MachoCmdDysymtab = 11, | 
|  | MachoCmdSegment64 = 25, | 
|  |  | 
|  | MachoFileObject = 1, | 
|  | MachoFileExecutable = 2, | 
|  | MachoFileFvmlib = 3, | 
|  | MachoFileCore = 4, | 
|  | MachoFilePreload = 5 | 
|  | }; | 
|  |  | 
|  | struct MachoSeg | 
|  | { | 
|  | char name[16+1]; | 
|  | uint64 vmaddr; | 
|  | uint64 vmsize; | 
|  | uint32 fileoff; | 
|  | uint32 filesz; | 
|  | uint32 maxprot; | 
|  | uint32 initprot; | 
|  | uint32 nsect; | 
|  | uint32 flags; | 
|  | MachoSect *sect; | 
|  | }; | 
|  |  | 
|  | struct MachoSect | 
|  | { | 
|  | char	name[16+1]; | 
|  | char	segname[16+1]; | 
|  | uint64 addr; | 
|  | uint64 size; | 
|  | uint32 offset; | 
|  | uint32 align; | 
|  | uint32 reloff; | 
|  | uint32 nreloc; | 
|  | uint32 flags; | 
|  |  | 
|  | MachoRel *rel; | 
|  | }; | 
|  |  | 
|  | struct MachoRel | 
|  | { | 
|  | uint32 addr; | 
|  | uint32 symnum; | 
|  | uint8 pcrel; | 
|  | uint8 length; | 
|  | uint8 extrn; | 
|  | uint8 type; | 
|  | }; | 
|  |  | 
|  | struct MachoSymtab | 
|  | { | 
|  | uint32 symoff; | 
|  | uint32 nsym; | 
|  | uint32 stroff; | 
|  | uint32 strsize; | 
|  |  | 
|  | char *str; | 
|  | MachoSym *sym; | 
|  | }; | 
|  |  | 
|  | struct MachoSym | 
|  | { | 
|  | char *name; | 
|  | uint8 type; | 
|  | uint8 sectnum; | 
|  | uint16 desc; | 
|  | char kind; | 
|  | uint64 value; | 
|  | }; | 
|  |  | 
|  | struct MachoDysymtab | 
|  | { | 
|  | uint32 ilocalsym; | 
|  | uint32 nlocalsym; | 
|  | uint32 iextdefsym; | 
|  | uint32 nextdefsym; | 
|  | uint32 iundefsym; | 
|  | uint32 nundefsym; | 
|  | uint32 tocoff; | 
|  | uint32 ntoc; | 
|  | uint32 modtaboff; | 
|  | uint32 nmodtab; | 
|  | uint32 extrefsymoff; | 
|  | uint32 nextrefsyms; | 
|  | uint32 indirectsymoff; | 
|  | uint32 nindirectsyms; | 
|  | uint32 extreloff; | 
|  | uint32 nextrel; | 
|  | uint32 locreloff; | 
|  | uint32 nlocrel; | 
|  | }; | 
|  |  | 
|  | struct MachoCmd | 
|  | { | 
|  | int type; | 
|  | uint32 off; | 
|  | uint32 size; | 
|  | MachoSeg seg; | 
|  | MachoSymtab sym; | 
|  | MachoDysymtab dsym; | 
|  | }; | 
|  |  | 
|  | struct Macho | 
|  | { | 
|  | int fd; | 
|  | int is64; | 
|  | uint cputype; | 
|  | uint subcputype; | 
|  | uint32 filetype; | 
|  | uint32 flags; | 
|  | MachoCmd *cmd; | 
|  | uint ncmd; | 
|  | uint16 (*e2)(uchar*); | 
|  | uint32 (*e4)(uchar*); | 
|  | uint64 (*e8)(uchar*); | 
|  | int (*coreregs)(Macho*, uchar**); | 
|  | }; | 
|  |  | 
|  | Macho *machoopen(char*); | 
|  | Macho *machoinit(int); | 
|  | void machoclose(Macho*); | 
|  | int coreregsmachopower(Macho*, uchar**); | 
|  | int macholoadrel(Macho*, MachoSect*); | 
|  | int macholoadsym(Macho*, MachoSymtab*); |