blob: 2b449f04cdbbaefedecc6e31969c00f143e5f2b7 [file] [log] [blame]
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*);