1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
|
/* Mach-O support for BFD.
Copyright (C) 2011-2014 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
#ifndef _MACH_O_EXTERNAL_H
#define _MACH_O_EXTERNAL_H
struct mach_o_header_external
{
unsigned char magic[4]; /* Magic number. */
unsigned char cputype[4]; /* CPU that this object is for. */
unsigned char cpusubtype[4]; /* CPU subtype. */
unsigned char filetype[4]; /* Type of file. */
unsigned char ncmds[4]; /* Number of load commands. */
unsigned char sizeofcmds[4]; /* Total size of load commands. */
unsigned char flags[4]; /* Flags. */
unsigned char reserved[4]; /* Reserved (on 64-bit version only). */
};
#define BFD_MACH_O_HEADER_SIZE 28
#define BFD_MACH_O_HEADER_64_SIZE 32
/* 32-bit section header. */
struct mach_o_section_32_external
{
unsigned char sectname[16]; /* Section name. */
unsigned char segname[16]; /* Segment that the section belongs to. */
unsigned char addr[4]; /* Address of this section in memory. */
unsigned char size[4]; /* Size in bytes of this section. */
unsigned char offset[4]; /* File offset of this section. */
unsigned char align[4]; /* log2 of this section's alignment. */
unsigned char reloff[4]; /* File offset of this section's relocs. */
unsigned char nreloc[4]; /* Number of relocs for this section. */
unsigned char flags[4]; /* Section flags/attributes. */
unsigned char reserved1[4];
unsigned char reserved2[4];
};
#define BFD_MACH_O_SECTION_SIZE 68
/* 64-bit section header. */
struct mach_o_section_64_external
{
unsigned char sectname[16]; /* Section name. */
unsigned char segname[16]; /* Segment that the section belongs to. */
unsigned char addr[8]; /* Address of this section in memory. */
unsigned char size[8]; /* Size in bytes of this section. */
unsigned char offset[4]; /* File offset of this section. */
unsigned char align[4]; /* log2 of this section's alignment. */
unsigned char reloff[4]; /* File offset of this section's relocs. */
unsigned char nreloc[4]; /* Number of relocs for this section. */
unsigned char flags[4]; /* Section flags/attributes. */
unsigned char reserved1[4];
unsigned char reserved2[4];
unsigned char reserved3[4];
};
#define BFD_MACH_O_SECTION_64_SIZE 80
struct mach_o_load_command_external
{
unsigned char cmd[4]; /* The type of load command. */
unsigned char cmdsize[4]; /* Size in bytes of entire command. */
};
#define BFD_MACH_O_LC_SIZE 8
struct mach_o_segment_command_32_external
{
unsigned char segname[16]; /* Name of this segment. */
unsigned char vmaddr[4]; /* Virtual memory address of this segment. */
unsigned char vmsize[4]; /* Size there, in bytes. */
unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */
unsigned char filesize[4]; /* Size in bytes on disk. */
unsigned char maxprot[4]; /* Maximum permitted vm protection. */
unsigned char initprot[4]; /* Initial vm protection. */
unsigned char nsects[4]; /* Number of sections in this segment. */
unsigned char flags[4]; /* Flags that affect the loading. */
};
#define BFD_MACH_O_LC_SEGMENT_SIZE 56 /* Include the header. */
struct mach_o_segment_command_64_external
{
unsigned char segname[16]; /* Name of this segment. */
unsigned char vmaddr[8]; /* Virtual memory address of this segment. */
unsigned char vmsize[8]; /* Size there, in bytes. */
unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */
unsigned char filesize[8]; /* Size in bytes on disk. */
unsigned char maxprot[4]; /* Maximum permitted vm protection. */
unsigned char initprot[4]; /* Initial vm protection. */
unsigned char nsects[4]; /* Number of sections in this segment. */
unsigned char flags[4]; /* Flags that affect the loading. */
};
#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Include the header. */
struct mach_o_reloc_info_external
{
unsigned char r_address[4];
unsigned char r_symbolnum[4];
};
#define BFD_MACH_O_RELENT_SIZE 8
/* Relocations are based on 'address' being a section offset and an assumption
that sections are never more than 2^24-1 bytes in size. Relocation data
also carry information on type/size/PC-relative/extern and whether scattered
or not [stored in the MSB of the r_address]. */
#define BFD_MACH_O_SR_SCATTERED 0x80000000
/* For a non-scattered reloc, the relocation info is found in r_symbolnum.
Bytes 1 to 3 contain the symbol number (0xffffff, in a non-scattered PAIR).
Byte 4 contains the relocation info - but with differing bit-positions
dependent on target endian-ness - as below. */
#define BFD_MACH_O_LE_PCREL 0x01
#define BFD_MACH_O_LE_LENGTH_SHIFT 1
#define BFD_MACH_O_LE_EXTERN 0x08
#define BFD_MACH_O_LE_TYPE_SHIFT 4
#define BFD_MACH_O_BE_PCREL 0x80
#define BFD_MACH_O_BE_LENGTH_SHIFT 5
#define BFD_MACH_O_BE_EXTERN 0x10
#define BFD_MACH_O_BE_TYPE_SHIFT 0
/* The field sizes are the same for both BE and LE. */
#define BFD_MACH_O_LENGTH_MASK 0x03
#define BFD_MACH_O_TYPE_MASK 0x0f
/* For a scattered reloc entry the info is contained in r_address. There
is no need to discriminate on target endian-ness, since the design was
arranged to produce the same layout on both. Scattered relocations are
only used for local items, therefore there is no 'extern' field. */
#define BFD_MACH_O_SR_PCREL 0x40000000
#define BFD_MACH_O_GET_SR_LENGTH(s) (((s) >> 28) & 0x3)
#define BFD_MACH_O_GET_SR_TYPE(s) (((s) >> 24) & 0x0f)
#define BFD_MACH_O_GET_SR_ADDRESS(s) ((s) & 0x00ffffff)
#define BFD_MACH_O_SET_SR_LENGTH(l) (((l) & 0x3) << 28)
#define BFD_MACH_O_SET_SR_TYPE(t) (((t) & 0xf) << 24)
#define BFD_MACH_O_SET_SR_ADDRESS(s) ((s) & 0x00ffffff)
struct mach_o_symtab_command_external
{
unsigned char symoff[4]; /* File offset of the symbol table. */
unsigned char nsyms[4]; /* Number of symbols. */
unsigned char stroff[4]; /* File offset of the string table. */
unsigned char strsize[4]; /* String table size. */
};
struct mach_o_nlist_external
{
unsigned char n_strx[4];
unsigned char n_type[1];
unsigned char n_sect[1];
unsigned char n_desc[2];
unsigned char n_value[4];
};
#define BFD_MACH_O_NLIST_SIZE 12
struct mach_o_nlist_64_external
{
unsigned char n_strx[4];
unsigned char n_type[1];
unsigned char n_sect[1];
unsigned char n_desc[2];
unsigned char n_value[8];
};
#define BFD_MACH_O_NLIST_64_SIZE 16
struct mach_o_thread_command_external
{
unsigned char flavour[4];
unsigned char count[4];
};
/* For commands that just have a string or a path. */
struct mach_o_str_command_external
{
unsigned char str[4];
};
struct mach_o_dylib_command_external
{
unsigned char name[4];
unsigned char timestamp[4];
unsigned char current_version[4];
unsigned char compatibility_version[4];
};
struct mach_o_dysymtab_command_external
{
unsigned char ilocalsym[4]; /* Index of. */
unsigned char nlocalsym[4]; /* Number of. */
unsigned char iextdefsym[4];
unsigned char nextdefsym[4];
unsigned char iundefsym[4];
unsigned char nundefsym[4];
unsigned char tocoff[4];
unsigned char ntoc[4];
unsigned char modtaboff[4];
unsigned char nmodtab[4];
unsigned char extrefsymoff[4];
unsigned char nextrefsyms[4];
unsigned char indirectsymoff[4];
unsigned char nindirectsyms[4];
unsigned char extreloff[4];
unsigned char nextrel[4];
unsigned char locreloff[4];
unsigned char nlocrel[4];
};
struct mach_o_dylib_module_external
{
unsigned char module_name[4];
unsigned char iextdefsym[4];
unsigned char nextdefsym[4];
unsigned char irefsym[4];
unsigned char nrefsym[4];
unsigned char ilocalsym[4];
unsigned char nlocalsym[4];
unsigned char iextrel[4];
unsigned char nextrel[4];
unsigned char iinit_iterm[4];
unsigned char ninit_nterm[4];
unsigned char objc_module_info_addr[4];
unsigned char objc_module_info_size[4];
};
#define BFD_MACH_O_DYLIB_MODULE_SIZE 52
struct mach_o_dylib_module_64_external
{
unsigned char module_name[4];
unsigned char iextdefsym[4];
unsigned char nextdefsym[4];
unsigned char irefsym[4];
unsigned char nrefsym[4];
unsigned char ilocalsym[4];
unsigned char nlocalsym[4];
unsigned char iextrel[4];
unsigned char nextrel[4];
unsigned char iinit_iterm[4];
unsigned char ninit_nterm[4];
unsigned char objc_module_info_size[4];
unsigned char objc_module_info_addr[8];
};
#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56
struct mach_o_dylib_table_of_contents_external
{
unsigned char symbol_index[4];
unsigned char module_index[4];
};
#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8
struct mach_o_linkedit_data_command_external
{
unsigned char dataoff[4];
unsigned char datasize[4];
};
struct mach_o_dyld_info_command_external
{
unsigned char rebase_off[4];
unsigned char rebase_size[4];
unsigned char bind_off[4];
unsigned char bind_size[4];
unsigned char weak_bind_off[4];
unsigned char weak_bind_size[4];
unsigned char lazy_bind_off[4];
unsigned char lazy_bind_size[4];
unsigned char export_off[4];
unsigned char export_size[4];
};
struct mach_o_version_min_command_external
{
unsigned char version[4];
unsigned char reserved[4];
};
struct mach_o_encryption_info_command_external
{
unsigned char cryptoff[4]; /* File offset of the encrypted area. */
unsigned char cryptsize[4]; /* Size of the encrypted area. */
unsigned char cryptid[4]; /* Encryption method. */
};
struct mach_o_fvmlib_command_external
{
unsigned char name[4]; /* Offset of the name. */
unsigned char minor_version[4];
unsigned char header_addr[4];
};
struct mach_o_entry_point_command_external
{
unsigned char entryoff[8]; /* File offset of the entry point. */
unsigned char stacksize[8]; /* Initial stack size, if no null. */
};
struct mach_o_source_version_command_external
{
unsigned char version[8]; /* Version A.B.C.D.E, with 10 bits for B-E,
and 24 bits for A. */
};
/* The LD_DATA_IN_CODE command use a linkedit_data_command that points to
a table of entries. */
struct mach_o_data_in_code_entry_external
{
unsigned char offset[4]; /* Offset from the mach_header. */
unsigned char length[2]; /* Number of bytes. */
unsigned char kind[2]; /* Kind. See BFD_MACH_O_DICE_ values. */
};
struct mach_o_fat_header_external
{
unsigned char magic[4];
unsigned char nfat_arch[4]; /* Number of components. */
};
struct mach_o_fat_arch_external
{
unsigned char cputype[4];
unsigned char cpusubtype[4];
unsigned char offset[4]; /* File offset of the member. */
unsigned char size[4]; /* Size of the member. */
unsigned char align[4]; /* Power of 2. */
};
#endif /* _MACH_O_EXTERNAL_H */
|