~ubuntu-branches/ubuntu/precise/virtualbox/precise-updates

« back to all changes in this revision

Viewing changes to src/VBox/Runtime/include/internal/ldrMach-O.h

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2011-07-04 13:02:31 UTC
  • mfrom: (3.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20110704130231-l843es6wqhx614n7
Tags: 4.0.10-dfsg-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Add Apport hook.
    - debian/virtualbox-ose.files/source_virtualbox-ose.py
    - debian/virtualbox-ose.install
  - Drop *-source packages.
* Add the Modaliases control field manually for maximum backportability.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: ldrMach-O.h $ */
 
2
/** @file
 
3
 * IPRT - Mach-O Structures and Constants.
 
4
 */
 
5
 
 
6
/*
 
7
 * Copyright (C) 2011 Oracle Corporation
 
8
 *
 
9
 * This file is part of VirtualBox Open Source Edition (OSE), as
 
10
 * available from http://www.virtualbox.org. This file is free software;
 
11
 * you can redistribute it and/or modify it under the terms of the GNU
 
12
 * General Public License (GPL) as published by the Free Software
 
13
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 
14
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 
15
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 
16
 *
 
17
 * The contents of this file may alternatively be used under the terms
 
18
 * of the Common Development and Distribution License Version 1.0
 
19
 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
 
20
 * VirtualBox OSE distribution, in which case the provisions of the
 
21
 * CDDL are applicable instead of those of the GPL.
 
22
 *
 
23
 * You may elect to license modified versions of this file under the
 
24
 * terms and conditions of either the GPL or the CDDL or both.
 
25
 */
 
26
 
 
27
#ifndef ___internal_ldrMach_O_h
 
28
#define ___internal_ldrMach_O_h
 
29
 
 
30
#include <iprt/types.h>
 
31
 
 
32
#ifndef CPU_ARCH_MASK
 
33
 
 
34
/* cputype */
 
35
#define CPU_ARCH_MASK               INT32_C(0xff000000)
 
36
#define CPU_ARCH_ABI64              INT32_C(0x01000000)
 
37
#define CPU_TYPE_ANY                INT32_C(-1)
 
38
#define CPU_TYPE_VAX                INT32_C(1)
 
39
#define CPU_TYPE_MC680x0            INT32_C(6)
 
40
#define CPU_TYPE_X86                INT32_C(7)
 
41
#define CPU_TYPE_I386               CPU_TYPE_X86
 
42
#define CPU_TYPE_X86_64             (CPU_TYPE_X86 | CPU_ARCH_ABI64)
 
43
#define CPU_TYPE_MC98000            INT32_C(10)
 
44
#define CPU_TYPE_HPPA               INT32_C(11)
 
45
#define CPU_TYPE_MC88000            INT32_C(13)
 
46
#define CPU_TYPE_SPARC              INT32_C(14)
 
47
#define CPU_TYPE_I860               INT32_C(15)
 
48
#define CPU_TYPE_POWERPC            INT32_C(18)
 
49
#define CPU_TYPE_POWERPC64          (CPU_TYPE_POWERPC | CPU_ARCH_ABI64)
 
50
 
 
51
/* cpusubtype */
 
52
#define CPU_SUBTYPE_MULTIPLE        INT32_C(-1)
 
53
#define CPU_SUBTYPE_LITTLE_ENDIAN   INT32_C(0)
 
54
#define CPU_SUBTYPE_BIG_ENDIAN      INT32_C(1)
 
55
 
 
56
#define CPU_SUBTYPE_VAX_ALL         INT32_C(0)
 
57
#define CPU_SUBTYPE_VAX780          INT32_C(1)
 
58
#define CPU_SUBTYPE_VAX785          INT32_C(2)
 
59
#define CPU_SUBTYPE_VAX750          INT32_C(3)
 
60
#define CPU_SUBTYPE_VAX730          INT32_C(4)
 
61
#define CPU_SUBTYPE_UVAXI           INT32_C(5)
 
62
#define CPU_SUBTYPE_UVAXII          INT32_C(6)
 
63
#define CPU_SUBTYPE_VAX8200         INT32_C(7)
 
64
#define CPU_SUBTYPE_VAX8500         INT32_C(8)
 
65
#define CPU_SUBTYPE_VAX8600         INT32_C(9)
 
66
#define CPU_SUBTYPE_VAX8650         INT32_C(10)
 
67
#define CPU_SUBTYPE_VAX8800         INT32_C(11)
 
68
#define CPU_SUBTYPE_UVAXIII         INT32_C(12)
 
69
 
 
70
#define CPU_SUBTYPE_MC680x0_ALL     INT32_C(1)
 
71
#define CPU_SUBTYPE_MC68030         INT32_C(1)
 
72
#define CPU_SUBTYPE_MC68040         INT32_C(2)
 
73
#define CPU_SUBTYPE_MC68030_ONLY    INT32_C(3)
 
74
 
 
75
#define CPU_SUBTYPE_INTEL(fam, model)       ( (int32_t )(((model) << 4) | (fam)) )
 
76
#define CPU_SUBTYPE_INTEL_FAMILY(subtype)   ( (subtype) & 0xf )
 
77
#define CPU_SUBTYPE_INTEL_MODEL(subtype)    ( (subtype) >> 4 )
 
78
#define CPU_SUBTYPE_INTEL_FAMILY_MAX        0xf
 
79
#define CPU_SUBTYPE_INTEL_MODEL_ALL         0
 
80
 
 
81
#define CPU_SUBTYPE_I386_ALL        CPU_SUBTYPE_INTEL(3, 0)
 
82
#define CPU_SUBTYPE_386             CPU_SUBTYPE_INTEL(3, 0)
 
83
#define CPU_SUBTYPE_486             CPU_SUBTYPE_INTEL(4, 0)
 
84
#define CPU_SUBTYPE_486SX           CPU_SUBTYPE_INTEL(4, 8)
 
85
#define CPU_SUBTYPE_586             CPU_SUBTYPE_INTEL(5, 0)
 
86
#define CPU_SUBTYPE_PENT            CPU_SUBTYPE_INTEL(5, 0)
 
87
#define CPU_SUBTYPE_PENTPRO         CPU_SUBTYPE_INTEL(6, 1)
 
88
#define CPU_SUBTYPE_PENTII_M3       CPU_SUBTYPE_INTEL(6, 3)
 
89
#define CPU_SUBTYPE_PENTII_M5       CPU_SUBTYPE_INTEL(6, 5)
 
90
#define CPU_SUBTYPE_CELERON         CPU_SUBTYPE_INTEL(7, 6)
 
91
#define CPU_SUBTYPE_CELERON_MOBILE  CPU_SUBTYPE_INTEL(7, 7)
 
92
#define CPU_SUBTYPE_PENTIUM_3       CPU_SUBTYPE_INTEL(8, 0)
 
93
#define CPU_SUBTYPE_PENTIUM_3_M     CPU_SUBTYPE_INTEL(8, 1)
 
94
#define CPU_SUBTYPE_PENTIUM_3_XEON  CPU_SUBTYPE_INTEL(8, 2)
 
95
#define CPU_SUBTYPE_PENTIUM_M       CPU_SUBTYPE_INTEL(9, 0)
 
96
#define CPU_SUBTYPE_PENTIUM_4       CPU_SUBTYPE_INTEL(10, 0)
 
97
#define CPU_SUBTYPE_PENTIUM_4_M     CPU_SUBTYPE_INTEL(10, 1)
 
98
#define CPU_SUBTYPE_ITANIUM         CPU_SUBTYPE_INTEL(11, 0)
 
99
#define CPU_SUBTYPE_ITANIUM_2       CPU_SUBTYPE_INTEL(11, 1)
 
100
#define CPU_SUBTYPE_XEON            CPU_SUBTYPE_INTEL(12, 0)
 
101
#define CPU_SUBTYPE_XEON_MP         CPU_SUBTYPE_INTEL(12, 1)
 
102
 
 
103
#define CPU_SUBTYPE_X86_ALL         INT32_C(3)
 
104
#define CPU_SUBTYPE_X86_64_ALL      INT32_C(3)
 
105
#define CPU_SUBTYPE_X86_ARCH1       INT32_C(4)
 
106
 
 
107
#define CPU_SUBTYPE_MIPS_ALL        INT32_C(0)
 
108
#define CPU_SUBTYPE_MIPS_R2300      INT32_C(1)
 
109
#define CPU_SUBTYPE_MIPS_R2600      INT32_C(2)
 
110
#define CPU_SUBTYPE_MIPS_R2800      INT32_C(3)
 
111
#define CPU_SUBTYPE_MIPS_R2000a     INT32_C(4)
 
112
#define CPU_SUBTYPE_MIPS_R2000      INT32_C(5)
 
113
#define CPU_SUBTYPE_MIPS_R3000a     INT32_C(6)
 
114
#define CPU_SUBTYPE_MIPS_R3000      INT32_C(7)
 
115
 
 
116
#define CPU_SUBTYPE_MC98000_ALL     INT32_C(0)
 
117
#define CPU_SUBTYPE_MC98601         INT32_C(1)
 
118
 
 
119
#define CPU_SUBTYPE_HPPA_ALL        INT32_C(0)
 
120
#define CPU_SUBTYPE_HPPA_7100       INT32_C(0)
 
121
#define CPU_SUBTYPE_HPPA_7100LC     INT32_C(1)
 
122
 
 
123
#define CPU_SUBTYPE_MC88000_ALL     INT32_C(0)
 
124
#define CPU_SUBTYPE_MC88100         INT32_C(1)
 
125
#define CPU_SUBTYPE_MC88110         INT32_C(2)
 
126
 
 
127
#define CPU_SUBTYPE_SPARC_ALL       INT32_C(0)
 
128
 
 
129
#define CPU_SUBTYPE_I860_ALL        INT32_C(0)
 
130
#define CPU_SUBTYPE_I860_860        INT32_C(1)
 
131
 
 
132
#define CPU_SUBTYPE_POWERPC_ALL     INT32_C(0)
 
133
#define CPU_SUBTYPE_POWERPC_601     INT32_C(1)
 
134
#define CPU_SUBTYPE_POWERPC_602     INT32_C(2)
 
135
#define CPU_SUBTYPE_POWERPC_603     INT32_C(3)
 
136
#define CPU_SUBTYPE_POWERPC_603e    INT32_C(4)
 
137
#define CPU_SUBTYPE_POWERPC_603ev   INT32_C(5)
 
138
#define CPU_SUBTYPE_POWERPC_604     INT32_C(6)
 
139
#define CPU_SUBTYPE_POWERPC_604e    INT32_C(7)
 
140
#define CPU_SUBTYPE_POWERPC_620     INT32_C(8)
 
141
#define CPU_SUBTYPE_POWERPC_750     INT32_C(9)
 
142
#define CPU_SUBTYPE_POWERPC_7400    INT32_C(10)
 
143
#define CPU_SUBTYPE_POWERPC_7450    INT32_C(11)
 
144
#define CPU_SUBTYPE_POWERPC_Max     INT32_C(10)
 
145
#define CPU_SUBTYPE_POWERPC_SCVger  INT32_C(11)
 
146
#define CPU_SUBTYPE_POWERPC_970     INT32_C(100)
 
147
 
 
148
#define CPU_SUBTYPE_MASK            UINT32_C(0xff000000)
 
149
#define CPU_SUBTYPE_LIB64           UINT32_C(0x80000000)
 
150
 
 
151
#endif /* !CPU_ARCH_MASK */
 
152
 
 
153
 
 
154
typedef struct fat_header
 
155
{
 
156
    uint32_t            magic;
 
157
    uint32_t            nfat_arch;
 
158
} fat_header_t;
 
159
 
 
160
#ifndef IMAGE_FAT_SIGNATURE
 
161
# define IMAGE_FAT_SIGNATURE        UINT32_C(0xcafebabe)
 
162
#endif
 
163
#ifndef IMAGE_FAT_SIGNATURE_OE
 
164
# define IMAGE_FAT_SIGNATURE_OE     UINT32_C(0xbebafeca)
 
165
#endif
 
166
 
 
167
typedef struct fat_arch
 
168
{
 
169
    int32_t             cputype;
 
170
    int32_t             cpusubtype;
 
171
    uint32_t            offset;
 
172
    uint32_t            size;
 
173
    uint32_t            align;
 
174
} fat_arch_t;
 
175
 
 
176
typedef struct mach_header_32
 
177
{
 
178
    uint32_t            magic;
 
179
    int32_t             cputype;
 
180
    int32_t             cpusubtype;
 
181
    uint32_t            filetype;
 
182
    uint32_t            ncmds;
 
183
    uint32_t            sizeofcmds;
 
184
    uint32_t            flags;
 
185
} mach_header_32_t;
 
186
 
 
187
/* magic */
 
188
#ifndef IMAGE_MACHO32_SIGNATURE
 
189
# define IMAGE_MACHO32_SIGNATURE    UINT32_C(0xfeedface)
 
190
#endif
 
191
#ifndef IMAGE_MACHO32_SIGNATURE_OE
 
192
# define IMAGE_MACHO32_SIGNATURE_OE UINT32_C(0xcefaedfe)
 
193
#endif
 
194
#define MH_MAGIC                    IMAGE_MACHO32_SIGNATURE
 
195
#define MH_CIGAM                    IMAGE_MACHO32_SIGNATURE_OE
 
196
 
 
197
typedef struct mach_header_64
 
198
{
 
199
    uint32_t            magic;
 
200
    int32_t             cputype;
 
201
    int32_t             cpusubtype;
 
202
    uint32_t            filetype;
 
203
    uint32_t            ncmds;
 
204
    uint32_t            sizeofcmds;
 
205
    uint32_t            flags;
 
206
    uint32_t            reserved;
 
207
} mach_header_64_t;
 
208
 
 
209
/* magic */
 
210
#ifndef IMAGE_MACHO64_SIGNATURE
 
211
# define IMAGE_MACHO64_SIGNATURE    UINT32_C(0xfeedfacf)
 
212
#endif
 
213
#ifndef IMAGE_MACHO64_SIGNATURE_OE
 
214
# define IMAGE_MACHO64_SIGNATURE_OE UINT32_C(0xfefaedfe)
 
215
#endif
 
216
#define MH_MAGIC_64                 IMAGE_MACHO64_SIGNATURE
 
217
#define MH_CIGAM_64                 IMAGE_MACHO64_SIGNATURE_OE
 
218
 
 
219
/* mach_header_* filetype */
 
220
#define MH_OBJECT                   UINT32_C(1)
 
221
#define MH_EXECUTE                  UINT32_C(2)
 
222
#define MH_FVMLIB                   UINT32_C(3)
 
223
#define MH_CORE                     UINT32_C(4)
 
224
#define MH_PRELOAD                  UINT32_C(5)
 
225
#define MH_DYLIB                    UINT32_C(6)
 
226
#define MH_DYLINKER                 UINT32_C(7)
 
227
#define MH_BUNDLE                   UINT32_C(8)
 
228
#define MH_DYLIB_STUB               UINT32_C(9)
 
229
#define MH_DSYM                     UINT32_C(10)
 
230
 
 
231
/* mach_header_* flags */
 
232
#define MH_NOUNDEFS                 UINT32_C(0x00000001)
 
233
#define MH_INCRLINK                 UINT32_C(0x00000002)
 
234
#define MH_DYLDLINK                 UINT32_C(0x00000004)
 
235
#define MH_BINDATLOAD               UINT32_C(0x00000008)
 
236
#define MH_PREBOUND                 UINT32_C(0x00000010)
 
237
#define MH_SPLIT_SEGS               UINT32_C(0x00000020)
 
238
#define MH_LAZY_INIT                UINT32_C(0x00000040)
 
239
#define MH_TWOLEVEL                 UINT32_C(0x00000080)
 
240
#define MH_FORCE_FLAT               UINT32_C(0x00000100)
 
241
#define MH_NOMULTIDEFS              UINT32_C(0x00000200)
 
242
#define MH_NOFIXPREBINDING          UINT32_C(0x00000400)
 
243
#define MH_PREBINDABLE              UINT32_C(0x00000800)
 
244
#define MH_ALLMODSBOUND             UINT32_C(0x00001000)
 
245
#define MH_SUBSECTIONS_VIA_SYMBOLS  UINT32_C(0x00002000)
 
246
#define MH_CANONICAL                UINT32_C(0x00004000)
 
247
#define MH_WEAK_DEFINES             UINT32_C(0x00008000)
 
248
#define MH_BINDS_TO_WEAK            UINT32_C(0x00010000)
 
249
#define MH_ALLOW_STACK_EXECUTION    UINT32_C(0x00020000)
 
250
#define MH_VALID_FLAGS              UINT32_C(0x0003ffff)
 
251
 
 
252
 
 
253
typedef struct load_command
 
254
{
 
255
    uint32_t            cmd;
 
256
    uint32_t            cmdsize;
 
257
} load_command_t;
 
258
 
 
259
/* load cmd */
 
260
#define LC_REQ_DYLD                 UINT32_C(0x80000000)
 
261
#define LC_SEGMENT_32               UINT32_C(0x01)
 
262
#define LC_SYMTAB                   UINT32_C(0x02)
 
263
#define LC_SYMSEG                   UINT32_C(0x03)
 
264
#define LC_THREAD                   UINT32_C(0x04)
 
265
#define LC_UNIXTHREAD               UINT32_C(0x05)
 
266
#define LC_LOADFVMLIB               UINT32_C(0x06)
 
267
#define LC_IDFVMLIB                 UINT32_C(0x07)
 
268
#define LC_IDENT                    UINT32_C(0x08)
 
269
#define LC_FVMFILE                  UINT32_C(0x09)
 
270
#define LC_PREPAGE                  UINT32_C(0x0a)
 
271
#define LC_DYSYMTAB                 UINT32_C(0x0b)
 
272
#define LC_LOAD_DYLIB               UINT32_C(0x0c)
 
273
#define LC_ID_DYLIB                 UINT32_C(0x0d)
 
274
#define LC_LOAD_DYLINKER            UINT32_C(0x0e)
 
275
#define LC_ID_DYLINKER              UINT32_C(0x0f)
 
276
#define LC_PREBOUND_DYLIB           UINT32_C(0x10)
 
277
#define LC_ROUTINES                 UINT32_C(0x11)
 
278
#define LC_SUB_FRAMEWORK            UINT32_C(0x12)
 
279
#define LC_SUB_UMBRELLA             UINT32_C(0x13)
 
280
#define LC_SUB_CLIENT               UINT32_C(0x14)
 
281
#define LC_SUB_LIBRARY              UINT32_C(0x15)
 
282
#define LC_TWOLEVEL_HINTS           UINT32_C(0x16)
 
283
#define LC_PREBIND_CKSUM            UINT32_C(0x17)
 
284
#define LC_LOAD_WEAK_DYLIB (        UINT32_C(0x18) | LC_REQ_DYLD)
 
285
#define LC_SEGMENT_64               UINT32_C(0x19)
 
286
#define LC_ROUTINES_64              UINT32_C(0x1a)
 
287
#define LC_UUID                     UINT32_C(0x1b)
 
288
 
 
289
 
 
290
typedef struct lc_str
 
291
{
 
292
    uint32_t            offset;
 
293
} lc_str_t;
 
294
 
 
295
typedef struct segment_command_32
 
296
{
 
297
    uint32_t            cmd;
 
298
    uint32_t            cmdsize;
 
299
    char                segname[16];
 
300
    uint32_t            vmaddr;
 
301
    uint32_t            vmsize;
 
302
    uint32_t            fileoff;
 
303
    uint32_t            filesize;
 
304
    uint32_t            maxprot;
 
305
    uint32_t            initprot;
 
306
    uint32_t            nsects;
 
307
    uint32_t            flags;
 
308
} segment_command_32_t;
 
309
 
 
310
typedef struct segment_command_64
 
311
{
 
312
    uint32_t            cmd;
 
313
    uint32_t            cmdsize;
 
314
    char                segname[16];
 
315
    uint64_t            vmaddr;
 
316
    uint64_t            vmsize;
 
317
    uint64_t            fileoff;
 
318
    uint64_t            filesize;
 
319
    uint32_t            maxprot;
 
320
    uint32_t            initprot;
 
321
    uint32_t            nsects;
 
322
    uint32_t            flags;
 
323
} segment_command_64_t;
 
324
 
 
325
/* segment flags */
 
326
#define SG_HIGHVM           UINT32_C(0x00000001)
 
327
#define SG_FVMLIB           UINT32_C(0x00000002)
 
328
#define SG_NORELOC          UINT32_C(0x00000004)
 
329
#define SG_PROTECTED_VERSION_1 UINT32_C(0x00000008)
 
330
 
 
331
/* maxprot/initprot */
 
332
#ifndef VM_PROT_NONE
 
333
# define VM_PROT_NONE       UINT32_C(0x00000000)
 
334
# define VM_PROT_READ       UINT32_C(0x00000001)
 
335
# define VM_PROT_WRITE      UINT32_C(0x00000002)
 
336
# define VM_PROT_EXECUTE    UINT32_C(0x00000004)
 
337
# define VM_PROT_ALL        UINT32_C(0x00000007)
 
338
#endif
 
339
 
 
340
typedef struct section_32
 
341
{
 
342
    char                sectname[16];
 
343
    char                segname[16];
 
344
    uint32_t            addr;
 
345
    uint32_t            size;
 
346
    uint32_t            offset;
 
347
    uint32_t            align;
 
348
    uint32_t            reloff;
 
349
    uint32_t            nreloc;
 
350
    uint32_t            flags;
 
351
    uint32_t            reserved1;
 
352
    uint32_t            reserved2;
 
353
} section_32_t;
 
354
 
 
355
typedef struct section_64
 
356
{
 
357
    char                sectname[16];
 
358
    char                segname[16];
 
359
    uint64_t            addr;
 
360
    uint64_t            size;
 
361
    uint32_t            offset;
 
362
    uint32_t            align;
 
363
    uint32_t            reloff;
 
364
    uint32_t            nreloc;
 
365
    uint32_t            flags;
 
366
    uint32_t            reserved1;
 
367
    uint32_t            reserved2;
 
368
    uint32_t            reserved3;
 
369
} section_64_t;
 
370
 
 
371
/* section flags */
 
372
#define SECTION_TYPE                UINT32_C(0x000000ff)
 
373
#define S_REGULAR                   0x0
 
374
#define S_ZEROFILL                  0x1
 
375
#define S_CSTRING_LITERALS          0x2
 
376
#define S_4BYTE_LITERALS            0x3
 
377
#define S_8BYTE_LITERALS            0x4
 
378
#define S_LITERAL_POINTERS          0x5
 
379
#define S_NON_LAZY_SYMBOL_POINTERS  0x6
 
380
#define S_LAZY_SYMBOL_POINTERS      0x7
 
381
#define S_SYMBOL_STUBS              0x8
 
382
#define S_MOD_INIT_FUNC_POINTERS    0x9
 
383
#define S_MOD_TERM_FUNC_POINTERS    0xa
 
384
#define S_COALESCED                 0xb
 
385
#define S_GB_ZEROFILL               0xc
 
386
#define S_INTERPOSING               0xd
 
387
#define S_16BYTE_LITERALS           0xe
 
388
#define S_DTRACE_DOF                0xf
 
389
#define S_LAZY_DYLIB_SYMBOL_POINTERS 0x10
 
390
 
 
391
#define SECTION_ATTRIBUTES          UINT32_C(0xffffff00)
 
392
#define SECTION_ATTRIBUTES_USR      UINT32_C(0xff000000)
 
393
#define S_ATTR_PURE_INSTRUCTIONS    UINT32_C(0x80000000)
 
394
#define S_ATTR_NO_TOC               UINT32_C(0x40000000)
 
395
#define S_ATTR_STRIP_STATIC_SYMS    UINT32_C(0x20000000)
 
396
#define S_ATTR_NO_DEAD_STRIP        UINT32_C(0x10000000)
 
397
#define S_ATTR_LIVE_SUPPORT         UINT32_C(0x08000000)
 
398
#define S_ATTR_SELF_MODIFYING_CODE  UINT32_C(0x04000000)
 
399
#define S_ATTR_DEBUG                UINT32_C(0x02000000)
 
400
#define SECTION_ATTRIBUTES_SYS      UINT32_C(0x00ffff00)
 
401
#define S_ATTR_SOME_INSTRUCTIONS    UINT32_C(0x00000400)
 
402
#define S_ATTR_EXT_RELOC            UINT32_C(0x00000200)
 
403
#define S_ATTR_LOC_RELOC            UINT32_C(0x00000100)
 
404
 
 
405
/* standard section names */
 
406
#define SEG_PAGEZERO                "__PAGEZERO"
 
407
#define SEG_TEXT                    "__TEXT"
 
408
#define SECT_TEXT                   "__text"
 
409
#define SECT_FVMLIB_INIT0           "__fvmlib_init0"
 
410
#define SECT_FVMLIB_INIT1           "__fvmlib_init1"
 
411
#define SEG_DATA                    "__DATA"
 
412
#define SECT_DATA                   "__data"
 
413
#define SECT_BSS                    "__bss"
 
414
#define SECT_COMMON                 "__common"
 
415
#define SEG_OBJC                    "__OBJC"
 
416
#define SECT_OBJC_SYMBOLS           "__symbol_table"
 
417
#define SECT_OBJC_MODULES           "__module_info"
 
418
#define SECT_OBJC_STRINGS           "__selector_strs"
 
419
#define SECT_OBJC_REFS              "__selector_refs"
 
420
#define SEG_ICON                    "__ICON"
 
421
#define SECT_ICON_HEADER            "__header"
 
422
#define SECT_ICON_TIFF              "__tiff"
 
423
#define SEG_LINKEDIT                "__LINKEDIT"
 
424
#define SEG_UNIXSTACK               "__UNIXSTACK"
 
425
#define SEG_IMPORT                  "__IMPORT"
 
426
 
 
427
typedef struct thread_command
 
428
{
 
429
    uint32_t            cmd;
 
430
    uint32_t            cmdsize;
 
431
} thread_command_t;
 
432
 
 
433
typedef struct symtab_command
 
434
{
 
435
    uint32_t            cmd;
 
436
    uint32_t            cmdsize;
 
437
    uint32_t            symoff;
 
438
    uint32_t            nsyms;
 
439
    uint32_t            stroff;
 
440
    uint32_t            strsize;
 
441
} symtab_command_t;
 
442
 
 
443
typedef struct uuid_command
 
444
{
 
445
    uint32_t            cmd;
 
446
    uint32_t            cmdsize;
 
447
    uint8_t             uuid[16];
 
448
} uuid_command_t;
 
449
 
 
450
typedef struct macho_nlist_32
 
451
{
 
452
    union
 
453
    {
 
454
        int32_t         n_strx;
 
455
    }                   n_un;
 
456
    uint8_t             n_type;
 
457
    uint8_t             n_sect;
 
458
    int16_t             n_desc;
 
459
    uint32_t            n_value;
 
460
} macho_nlist_32_t;
 
461
 
 
462
 
 
463
typedef struct macho_nlist_64
 
464
{
 
465
    union
 
466
    {
 
467
        uint32_t        n_strx;
 
468
    }                   n_un;
 
469
    uint8_t             n_type;
 
470
    uint8_t             n_sect;
 
471
    int16_t             n_desc;
 
472
    uint64_t            n_value;
 
473
} macho_nlist_64_t;
 
474
 
 
475
#define MACHO_N_EXT                 UINT8_C(0x01)
 
476
#define MACHO_N_PEXT                UINT8_C(0x10)
 
477
 
 
478
#define MACHO_N_TYPE                UINT8_C(0x0e)
 
479
#define MACHO_N_UNDF                UINT8_C(0x00)
 
480
#define MACHO_N_ABS                 UINT8_C(0x02)
 
481
#define MACHO_N_INDR                UINT8_C(0x0a)
 
482
#define MACHO_N_PBUD                UINT8_C(0x0c)
 
483
#define MACHO_N_SECT                UINT8_C(0x0e)
 
484
 
 
485
#define MACHO_N_STAB                UINT8_C(0xe0)
 
486
#define MACHO_N_GSYM                UINT8_C(0x20)
 
487
#define MACHO_N_FNAME               UINT8_C(0x22)
 
488
#define MACHO_N_FUN                 UINT8_C(0x24)
 
489
#define MACHO_N_STSYM               UINT8_C(0x26)
 
490
#define MACHO_N_LCSYM               UINT8_C(0x28)
 
491
#define MACHO_N_BNSYM               UINT8_C(0x2e)
 
492
#define MACHO_N_PC                  UINT8_C(0x30)
 
493
#define MACHO_N_OPT                 UINT8_C(0x3c)
 
494
#define MACHO_N_RSYM                UINT8_C(0x40)
 
495
#define MACHO_N_SLINE               UINT8_C(0x44)
 
496
#define MACHO_N_ENSYM               UINT8_C(0x4e)
 
497
#define MACHO_N_SSYM                UINT8_C(0x60)
 
498
#define MACHO_N_SO                  UINT8_C(0x64)
 
499
#define MACHO_N_OSO                 UINT8_C(0x66)
 
500
#define MACHO_N_LSYM                UINT8_C(0x80)
 
501
#define MACHO_N_BINCL               UINT8_C(0x82)
 
502
#define MACHO_N_SOL                 UINT8_C(0x84)
 
503
#define MACHO_N_PARAMS              UINT8_C(0x86)
 
504
#define MACHO_N_VERSION             UINT8_C(0x88)
 
505
#define MACHO_N_OLEVEL              UINT8_C(0x8A)
 
506
#define MACHO_N_PSYM                UINT8_C(0xa0)
 
507
#define MACHO_N_EINCL               UINT8_C(0xa2)
 
508
#define MACHO_N_ENTRY               UINT8_C(0xa4)
 
509
#define MACHO_N_LBRAC               UINT8_C(0xc0)
 
510
#define MACHO_N_EXCL                UINT8_C(0xc2)
 
511
#define MACHO_N_RBRAC               UINT8_C(0xe0)
 
512
#define MACHO_N_BCOMM               UINT8_C(0xe2)
 
513
#define MACHO_N_ECOMM               UINT8_C(0xe4)
 
514
#define MACHO_N_ECOML               UINT8_C(0xe8)
 
515
#define MACHO_N_LENG                UINT8_C(0xfe)
 
516
 
 
517
#define MACHO_NO_SECT               UINT8_C(0x00)
 
518
#define MACHO_MAX_SECT              UINT8_C(0xff)
 
519
 
 
520
#define REFERENCE_TYPE              UINT16_C(0x000f)
 
521
#define REFERENCE_FLAG_UNDEFINED_NON_LAZY             0
 
522
#define REFERENCE_FLAG_UNDEFINED_LAZY                 1
 
523
#define REFERENCE_FLAG_DEFINED                        2
 
524
#define REFERENCE_FLAG_PRIVATE_DEFINED                3
 
525
#define REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY     4
 
526
#define REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY         5
 
527
#define REFERENCED_DYNAMICALLY      UINT16_C(0x0010)
 
528
 
 
529
#define GET_LIBRARY_ORDINAL(a_n_desc) \
 
530
    RT_BYTE2(a_n_desc)
 
531
#define SET_LIBRARY_ORDINAL(a_n_desc, a_ordinal) \
 
532
    do { (a_n_desc) = RT_MAKE_U16(RT_BYTE1(a_n_desc), a_ordinal); } while (0)
 
533
 
 
534
#define SELF_LIBRARY_ORDINAL        0x00
 
535
#define MAX_LIBRARY_ORDINAL         0xfd
 
536
#define DYNAMIC_LOOKUP_ORDINAL      0xfe
 
537
#define EXECUTABLE_ORDINAL          0xff
 
538
 
 
539
#define N_NO_DEAD_STRIP             UINT16_C(0x0020)
 
540
#define N_DESC_DISCARDED            UINT16_C(0x0020)
 
541
#define N_WEAK_REF                  UINT16_C(0x0040)
 
542
#define N_WEAK_DEF                  UINT16_C(0x0080)
 
543
#define N_REF_TO_WEAK               UINT16_C(0x0080)
 
544
 
 
545
typedef struct macho_relocation_info
 
546
{
 
547
    int32_t             r_address;
 
548
    uint32_t            r_symbolnum : 24;
 
549
    uint32_t            r_pcrel     : 1;
 
550
    uint32_t            r_length    : 2;
 
551
    uint32_t            r_extern    : 1;
 
552
    uint32_t            r_type      : 4;
 
553
} macho_relocation_info_t;
 
554
 
 
555
#define R_ABS                       0
 
556
#define R_SCATTERED                 UINT32_C(0x80000000)
 
557
 
 
558
typedef struct scattered_relocation_info
 
559
{
 
560
#ifdef RT_LITTLE_ENDIAN
 
561
    uint32_t            r_address   : 24;
 
562
    uint32_t            r_type      : 4;
 
563
    uint32_t            r_length    : 2;
 
564
    uint32_t            r_pcrel     : 1;
 
565
    uint32_t            r_scattered : 1;
 
566
#elif defined(RT_BIG_ENDIAN)
 
567
    uint32_t            r_scattered : 1;
 
568
    uint32_t            r_pcrel     : 1;
 
569
    uint32_t            r_length    : 2;
 
570
    uint32_t            r_type      : 4;
 
571
    uint32_t            r_address   : 24;
 
572
#else
 
573
# error "Neither K_ENDIAN isn't LITTLE or BIG!"
 
574
#endif
 
575
    int32_t             r_value;
 
576
} scattered_relocation_info_t;
 
577
 
 
578
typedef enum reloc_type_generic
 
579
{
 
580
    GENERIC_RELOC_VANILLA = 0,
 
581
    GENERIC_RELOC_PAIR,
 
582
    GENERIC_RELOC_SECTDIFF,
 
583
    GENERIC_RELOC_PB_LA_PTR,
 
584
    GENERIC_RELOC_LOCAL_SECTDIFF
 
585
} reloc_type_generic_t;
 
586
 
 
587
typedef enum reloc_type_x86_64
 
588
{
 
589
    X86_64_RELOC_UNSIGNED = 0,
 
590
    X86_64_RELOC_SIGNED,
 
591
    X86_64_RELOC_BRANCH,
 
592
    X86_64_RELOC_GOT_LOAD,
 
593
    X86_64_RELOC_GOT,
 
594
    X86_64_RELOC_SUBTRACTOR,
 
595
    X86_64_RELOC_SIGNED_1,
 
596
    X86_64_RELOC_SIGNED_2,
 
597
    X86_64_RELOC_SIGNED_4
 
598
} reloc_type_x86_64_t;
 
599
 
 
600
#endif
 
601