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*);