typedef struct MachoHdr MachoHdr;
struct MachoHdr {
uint32 cpu;
uint32 subcpu;
};
typedef struct MachoSect MachoSect;
struct MachoSect {
char* name;
char* segname;
uint64 addr;
uint64 size;
uint32 off;
uint32 align;
uint32 reloc;
uint32 nreloc;
uint32 flag;
uint32 res1;
uint32 res2;
};
typedef struct MachoSeg MachoSeg;
struct MachoSeg {
char* name;
uint64 vsize;
uint64 vaddr;
uint64 fileoffset;
uint64 filesize;
uint32 prot1;
uint32 prot2;
uint32 nsect;
uint32 msect;
MachoSect *sect;
uint32 flag;
};
typedef struct MachoLoad MachoLoad;
struct MachoLoad {
uint32 type;
uint32 ndata;
uint32 *data;
};
MachoHdr* getMachoHdr(void);
MachoSeg* newMachoSeg(char*, int);
MachoSect* newMachoSect(MachoSeg*, char*, char*);
MachoLoad* newMachoLoad(uint32, uint32);
int machowrite(void);
void machoinit(void);
void machosymorder(void);
void machoemitreloc(void);
int machoreloc1(Reloc*, vlong);
#define INITIAL_MACHO_HEADR 4*1024
enum {
MACHO_CPU_AMD64 = (1<<24)|7,
MACHO_CPU_386 = 7,
MACHO_SUBCPU_X86 = 3,
MACHO32SYMSIZE = 12,
MACHO64SYMSIZE = 16,
MACHO_X86_64_RELOC_UNSIGNED = 0,
MACHO_X86_64_RELOC_SIGNED = 1,
MACHO_X86_64_RELOC_BRANCH = 2,
MACHO_X86_64_RELOC_GOT_LOAD = 3,
MACHO_X86_64_RELOC_GOT = 4,
MACHO_X86_64_RELOC_SUBTRACTOR = 5,
MACHO_X86_64_RELOC_SIGNED_1 = 6,
MACHO_X86_64_RELOC_SIGNED_2 = 7,
MACHO_X86_64_RELOC_SIGNED_4 = 8,
MACHO_GENERIC_RELOC_VANILLA = 0,
MACHO_FAKE_GOTPCREL = 100,
};
void domacho(void);
vlong domacholink(void);
void asmbmacho(void);
void machoadddynlib(char*);