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