Blob


1 typedef struct Macho Macho;
2 typedef struct MachoCmd MachoCmd;
3 typedef struct MachoSeg MachoSeg;
4 typedef struct MachoSect MachoSect;
5 typedef struct MachoRel MachoRel;
6 typedef struct MachoSymtab MachoSymtab;
7 typedef struct MachoSym MachoSym;
8 typedef struct MachoDysymtab MachoDysymtab;
10 enum
11 {
12 MachoCpuVax = 1,
13 MachoCpu68000 = 6,
14 MachoCpu386 = 7,
15 MachoCpuAmd64 = 0x1000007,
16 MachoCpuMips = 8,
17 MachoCpu98000 = 10,
18 MachoCpuHppa = 11,
19 MachoCpuArm = 12,
20 MachoCpu88000 = 13,
21 MachoCpuSparc = 14,
22 MachoCpu860 = 15,
23 MachoCpuAlpha = 16,
24 MachoCpuPower = 18,
26 MachoCmdSegment = 1,
27 MachoCmdSymtab = 2,
28 MachoCmdSymseg = 3,
29 MachoCmdThread = 4,
30 MachoCmdDysymtab = 11,
31 MachoCmdSegment64 = 25,
33 MachoFileObject = 1,
34 MachoFileExecutable = 2,
35 MachoFileFvmlib = 3,
36 MachoFileCore = 4,
37 MachoFilePreload = 5
38 };
40 struct MachoSeg
41 {
42 char name[16+1];
43 uint64 vmaddr;
44 uint64 vmsize;
45 uint32 fileoff;
46 uint32 filesz;
47 uint32 maxprot;
48 uint32 initprot;
49 uint32 nsect;
50 uint32 flags;
51 MachoSect *sect;
52 };
54 struct MachoSect
55 {
56 char name[16+1];
57 char segname[16+1];
58 uint64 addr;
59 uint64 size;
60 uint32 offset;
61 uint32 align;
62 uint32 reloff;
63 uint32 nreloc;
64 uint32 flags;
66 MachoRel *rel;
67 };
69 struct MachoRel
70 {
71 uint32 addr;
72 uint32 symnum;
73 uint8 pcrel;
74 uint8 length;
75 uint8 extrn;
76 uint8 type;
77 };
79 struct MachoSymtab
80 {
81 uint32 symoff;
82 uint32 nsym;
83 uint32 stroff;
84 uint32 strsize;
86 char *str;
87 MachoSym *sym;
88 };
90 struct MachoSym
91 {
92 char *name;
93 uint8 type;
94 uint8 sectnum;
95 uint16 desc;
96 char kind;
97 uint64 value;
98 };
100 struct MachoDysymtab
102 uint32 ilocalsym;
103 uint32 nlocalsym;
104 uint32 iextdefsym;
105 uint32 nextdefsym;
106 uint32 iundefsym;
107 uint32 nundefsym;
108 uint32 tocoff;
109 uint32 ntoc;
110 uint32 modtaboff;
111 uint32 nmodtab;
112 uint32 extrefsymoff;
113 uint32 nextrefsyms;
114 uint32 indirectsymoff;
115 uint32 nindirectsyms;
116 uint32 extreloff;
117 uint32 nextrel;
118 uint32 locreloff;
119 uint32 nlocrel;
120 };
122 struct MachoCmd
124 int type;
125 uint32 off;
126 uint32 size;
127 MachoSeg seg;
128 MachoSymtab sym;
129 MachoDysymtab dsym;
130 };
132 struct Macho
134 int fd;
135 int is64;
136 uint cputype;
137 uint subcputype;
138 uint32 filetype;
139 uint32 flags;
140 MachoCmd *cmd;
141 uint ncmd;
142 uint16 (*e2)(uchar*);
143 uint32 (*e4)(uchar*);
144 uint64 (*e8)(uchar*);
145 int (*coreregs)(Macho*, uchar**);
146 };
148 Macho *machoopen(char*);
149 Macho *machoinit(int);
150 void machoclose(Macho*);
151 int coreregsmachopower(Macho*, uchar**);
152 int macholoadrel(Macho*, MachoSect*);
153 int macholoadsym(Macho*, MachoSymtab*);