]> gitweb.factorcode.org Git - factor.git/blob - extra/macho/macho.factor
Fix build breaks
[factor.git] / extra / macho / macho.factor
1 ! Copyright (C) 2010 Erik Charlebois.
2 ! See http:// factorcode.org/license.txt for BSD license.
3 USING: alien.c-types alien.syntax classes.struct kernel literals math unix.types ;
4 IN: macho
5
6 TYPEDEF: int       integer_t
7 TYPEDEF: int       vm_prot_t
8 TYPEDEF: integer_t cpu_type_t
9 TYPEDEF: integer_t cpu_subtype_t
10 TYPEDEF: integer_t cpu_threadtype_t
11
12 CONSTANT: VM_PROT_NONE        HEX: 00
13 CONSTANT: VM_PROT_READ        HEX: 01
14 CONSTANT: VM_PROT_WRITE       HEX: 02
15 CONSTANT: VM_PROT_EXECUTE     HEX: 04
16 CONSTANT: VM_PROT_DEFAULT     HEX: 03
17 CONSTANT: VM_PROT_ALL         HEX: 07
18 CONSTANT: VM_PROT_NO_CHANGE   HEX: 08
19 CONSTANT: VM_PROT_COPY        HEX: 10
20 CONSTANT: VM_PROT_WANTS_COPY  HEX: 10
21
22 ! loader.h
23 STRUCT: mach_header
24     { magic         uint32_t      }
25     { cputype       cpu_type_t    }
26     { cpusubtype    cpu_subtype_t }
27     { filetype      uint32_t      }
28     { ncmds         uint32_t      }
29     { sizeofcmds    uint32_t      }
30     { flags         uint32_t      } ;
31
32 CONSTANT: MH_MAGIC    HEX: feedface
33 CONSTANT: MH_CIGAM    HEX: cefaedfe
34
35 STRUCT: mach_header_64
36     { magic         uint32_t      }
37     { cputype       cpu_type_t    }
38     { cpusubtype    cpu_subtype_t }
39     { filetype      uint32_t      }
40     { ncmds         uint32_t      }
41     { sizeofcmds    uint32_t      }
42     { flags         uint32_t      }
43     { reserved      uint32_t      } ;
44
45 CONSTANT: MH_MAGIC_64 HEX: feedfacf
46 CONSTANT: MH_CIGAM_64 HEX: cffaedfe
47
48 CONSTANT: MH_OBJECT       HEX: 1
49 CONSTANT: MH_EXECUTE      HEX: 2
50 CONSTANT: MH_FVMLIB       HEX: 3
51 CONSTANT: MH_CORE         HEX: 4
52 CONSTANT: MH_PRELOAD      HEX: 5
53 CONSTANT: MH_DYLIB        HEX: 6
54 CONSTANT: MH_DYLINKER     HEX: 7
55 CONSTANT: MH_BUNDLE       HEX: 8
56 CONSTANT: MH_DYLIB_STUB   HEX: 9
57 CONSTANT: MH_DSYM         HEX: a
58 CONSTANT: MH_KEXT_BUNDLE  HEX: b
59
60 CONSTANT: MH_NOUNDEFS                HEX: 1
61 CONSTANT: MH_INCRLINK                HEX: 2
62 CONSTANT: MH_DYLDLINK                HEX: 4
63 CONSTANT: MH_BINDATLOAD              HEX: 8
64 CONSTANT: MH_PREBOUND                HEX: 10
65 CONSTANT: MH_SPLIT_SEGS              HEX: 20
66 CONSTANT: MH_LAZY_INIT               HEX: 40
67 CONSTANT: MH_TWOLEVEL                HEX: 80
68 CONSTANT: MH_FORCE_FLAT              HEX: 100
69 CONSTANT: MH_NOMULTIDEFS             HEX: 200
70 CONSTANT: MH_NOFIXPREBINDING         HEX: 400
71 CONSTANT: MH_PREBINDABLE             HEX: 800
72 CONSTANT: MH_ALLMODSBOUND            HEX: 1000
73 CONSTANT: MH_SUBSECTIONS_VIA_SYMBOLS HEX: 2000
74 CONSTANT: MH_CANONICAL               HEX: 4000
75 CONSTANT: MH_WEAK_DEFINES            HEX: 8000
76 CONSTANT: MH_BINDS_TO_WEAK           HEX: 10000
77 CONSTANT: MH_ALLOW_STACK_EXECUTION   HEX: 20000
78 CONSTANT: MH_DEAD_STRIPPABLE_DYLIB   HEX: 400000
79 CONSTANT: MH_ROOT_SAFE               HEX: 40000
80 CONSTANT: MH_SETUID_SAFE             HEX: 80000
81 CONSTANT: MH_NO_REEXPORTED_DYLIBS    HEX: 100000
82 CONSTANT: MH_PIE                     HEX: 200000
83
84 STRUCT: load_command
85     { cmd     uint32_t }
86     { cmdsize uint32_t } ;
87
88 CONSTANT: LC_REQ_DYLD HEX: 80000000
89
90 CONSTANT: LC_SEGMENT            HEX: 1
91 CONSTANT: LC_SYMTAB             HEX: 2
92 CONSTANT: LC_SYMSEG             HEX: 3
93 CONSTANT: LC_THREAD             HEX: 4
94 CONSTANT: LC_UNIXTHREAD         HEX: 5
95 CONSTANT: LC_LOADFVMLIB         HEX: 6
96 CONSTANT: LC_IDFVMLIB           HEX: 7
97 CONSTANT: LC_IDENT              HEX: 8
98 CONSTANT: LC_FVMFILE            HEX: 9
99 CONSTANT: LC_PREPAGE            HEX: a
100 CONSTANT: LC_DYSYMTAB           HEX: b
101 CONSTANT: LC_LOAD_DYLIB         HEX: c
102 CONSTANT: LC_ID_DYLIB           HEX: d
103 CONSTANT: LC_LOAD_DYLINKER      HEX: e
104 CONSTANT: LC_ID_DYLINKER        HEX: f
105 CONSTANT: LC_PREBOUND_DYLIB     HEX: 10
106 CONSTANT: LC_ROUTINES           HEX: 11
107 CONSTANT: LC_SUB_FRAMEWORK      HEX: 12
108 CONSTANT: LC_SUB_UMBRELLA       HEX: 13
109 CONSTANT: LC_SUB_CLIENT         HEX: 14
110 CONSTANT: LC_SUB_LIBRARY        HEX: 15
111 CONSTANT: LC_TWOLEVEL_HINTS     HEX: 16
112 CONSTANT: LC_PREBIND_CKSUM      HEX: 17
113 CONSTANT: LC_LOAD_WEAK_DYLIB    HEX: 80000018
114 CONSTANT: LC_SEGMENT_64         HEX: 19
115 CONSTANT: LC_ROUTINES_64        HEX: 1a
116 CONSTANT: LC_UUID               HEX: 1b
117 CONSTANT: LC_RPATH              HEX: 8000001c
118 CONSTANT: LC_CODE_SIGNATURE     HEX: 1d
119 CONSTANT: LC_SEGMENT_SPLIT_INFO HEX: 1e
120 CONSTANT: LC_REEXPORT_DYLIB     HEX: 8000001f
121 CONSTANT: LC_LAZY_LOAD_DYLIB    HEX: 20
122 CONSTANT: LC_ENCRYPTION_INFO    HEX: 21
123 CONSTANT: LC_DYLD_INFO          HEX: 22
124 CONSTANT: LC_DYLD_INFO_ONLY     HEX: 80000022
125
126 UNION-STRUCT: lc_str
127     { offset    uint32_t }
128     { ptr       char*    } ;
129
130 STRUCT: segment_command
131     { cmd            uint32_t  }
132     { cmdsize        uint32_t  }
133     { segname        char[16]  }
134     { vmaddr         uint32_t  }
135     { vmsize         uint32_t  }
136     { fileoff        uint32_t  }
137     { filesize       uint32_t  }
138     { maxprot        vm_prot_t }
139     { initprot       vm_prot_t }
140     { nsects         uint32_t  }
141     { flags          uint32_t  } ;
142
143 STRUCT: segment_command_64
144     { cmd            uint32_t  }
145     { cmdsize        uint32_t  }
146     { segname        char[16]  }
147     { vmaddr         uint64_t  }
148     { vmsize         uint64_t  }
149     { fileoff        uint64_t  }
150     { filesize       uint64_t  }
151     { maxprot        vm_prot_t }
152     { initprot       vm_prot_t }
153     { nsects         uint32_t  }
154     { flags          uint32_t  } ;
155
156 CONSTANT: SG_HIGHVM               HEX: 1
157 CONSTANT: SG_FVMLIB               HEX: 2
158 CONSTANT: SG_NORELOC              HEX: 4
159 CONSTANT: SG_PROTECTED_VERSION_1  HEX: 8
160
161 STRUCT: section
162     { sectname        char[16] }
163     { segname         char[16] }
164     { addr            uint32_t }
165     { size            uint32_t }
166     { offset          uint32_t }
167     { align           uint32_t }
168     { reloff          uint32_t }
169     { nreloc          uint32_t }
170     { flags           uint32_t }
171     { reserved1       uint32_t }
172     { reserved2       uint32_t } ;
173
174 STRUCT: section_64
175     { sectname        char[16] }
176     { segname         char[16] }
177     { addr            uint64_t }
178     { size            uint64_t }
179     { offset          uint32_t }
180     { align           uint32_t }
181     { reloff          uint32_t }
182     { nreloc          uint32_t }
183     { flags           uint32_t }
184     { reserved1       uint32_t }
185     { reserved2       uint32_t }
186     { reserved3       uint32_t } ;
187
188 CONSTANT: SECTION_TYPE         HEX: 000000ff
189 CONSTANT: SECTION_ATTRIBUTES   HEX: ffffff00
190
191 CONSTANT: S_REGULAR                       HEX: 0
192 CONSTANT: S_ZEROFILL                      HEX: 1
193 CONSTANT: S_CSTRING_LITERALS              HEX: 2
194 CONSTANT: S_4BYTE_LITERALS                HEX: 3
195 CONSTANT: S_8BYTE_LITERALS                HEX: 4
196 CONSTANT: S_LITERAL_POINTERS              HEX: 5
197 CONSTANT: S_NON_LAZY_SYMBOL_POINTERS      HEX: 6
198 CONSTANT: S_LAZY_SYMBOL_POINTERS          HEX: 7
199 CONSTANT: S_SYMBOL_STUBS                  HEX: 8
200 CONSTANT: S_MOD_INIT_FUNC_POINTERS        HEX: 9
201 CONSTANT: S_MOD_TERM_FUNC_POINTERS        HEX: a
202 CONSTANT: S_COALESCED                     HEX: b
203 CONSTANT: S_GB_ZEROFILL                   HEX: c
204 CONSTANT: S_INTERPOSING                   HEX: d
205 CONSTANT: S_16BYTE_LITERALS               HEX: e
206 CONSTANT: S_DTRACE_DOF                    HEX: f
207 CONSTANT: S_LAZY_DYLIB_SYMBOL_POINTERS    HEX: 10
208
209 CONSTANT: SECTION_ATTRIBUTES_USR     HEX: ff000000
210 CONSTANT: S_ATTR_PURE_INSTRUCTIONS   HEX: 80000000
211 CONSTANT: S_ATTR_NO_TOC              HEX: 40000000
212 CONSTANT: S_ATTR_STRIP_STATIC_SYMS   HEX: 20000000
213 CONSTANT: S_ATTR_NO_DEAD_STRIP       HEX: 10000000
214 CONSTANT: S_ATTR_LIVE_SUPPORT        HEX: 08000000
215 CONSTANT: S_ATTR_SELF_MODIFYING_CODE HEX: 04000000
216 CONSTANT: S_ATTR_DEBUG               HEX: 02000000
217 CONSTANT: SECTION_ATTRIBUTES_SYS     HEX: 00ffff00
218 CONSTANT: S_ATTR_SOME_INSTRUCTIONS   HEX: 00000400
219 CONSTANT: S_ATTR_EXT_RELOC           HEX: 00000200
220 CONSTANT: S_ATTR_LOC_RELOC           HEX: 00000100
221
222 CONSTANT: SEG_PAGEZERO      "__PAGEZERO"
223 CONSTANT: SEG_TEXT          "__TEXT"
224 CONSTANT: SECT_TEXT         "__text"
225 CONSTANT: SECT_FVMLIB_INIT0 "__fvmlib_init0"
226 CONSTANT: SECT_FVMLIB_INIT1 "__fvmlib_init1"
227 CONSTANT: SEG_DATA          "__DATA"
228 CONSTANT: SECT_DATA         "__data"
229 CONSTANT: SECT_BSS          "__bss"
230 CONSTANT: SECT_COMMON       "__common"
231 CONSTANT: SEG_OBJC          "__OBJC"
232 CONSTANT: SECT_OBJC_SYMBOLS "__symbol_table"
233 CONSTANT: SECT_OBJC_MODULES "__module_info"
234 CONSTANT: SECT_OBJC_STRINGS "__selector_strs"
235 CONSTANT: SECT_OBJC_REFS    "__selector_refs"
236 CONSTANT: SEG_ICON          "__ICON"
237 CONSTANT: SECT_ICON_HEADER  "__header"
238 CONSTANT: SECT_ICON_TIFF    "__tiff"
239 CONSTANT: SEG_LINKEDIT      "__LINKEDIT"
240 CONSTANT: SEG_UNIXSTACK     "__UNIXSTACK"
241 CONSTANT: SEG_IMPORT        "__IMPORT"
242
243 STRUCT: fvmlib
244     { name             lc_str   }
245     { minor_version    uint32_t }
246     { header_addr      uint32_t } ;
247
248 STRUCT: fvmlib_command
249     { cmd        uint32_t }
250     { cmdsize    uint32_t }
251     { fvmlib     fvmlib   } ;
252
253 STRUCT: dylib
254     { name                  lc_str   }
255     { timestamp             uint32_t }
256     { current_version       uint32_t }
257     { compatibility_version uint32_t } ;
258
259 STRUCT: dylib_command
260     { cmd        uint32_t }
261     { cmdsize    uint32_t }
262     { dylib      dylib    } ;
263
264 STRUCT: sub_framework_command
265     { cmd         uint32_t }
266     { cmdsize     uint32_t }
267     { umbrella    lc_str   } ;
268
269 STRUCT: sub_client_command
270     { cmd        uint32_t }
271     { cmdsize    uint32_t }
272     { client     lc_str   } ;
273
274 STRUCT: sub_umbrella_command
275     { cmd             uint32_t }
276     { cmdsize         uint32_t }
277     { sub_umbrella    lc_str   } ;
278
279 STRUCT: sub_library_command
280     { cmd            uint32_t }
281     { cmdsize        uint32_t }
282     { sub_library    lc_str   } ;
283
284 STRUCT: prebound_dylib_command
285     { cmd               uint32_t }
286     { cmdsize           uint32_t }
287     { name              lc_str   }
288     { nmodules          uint32_t }
289     { linked_modules    lc_str   } ;
290
291 STRUCT: dylinker_command
292     { cmd        uint32_t }
293     { cmdsize    uint32_t }
294     { name       lc_str   } ;
295
296 STRUCT: thread_command
297     { cmd        uint32_t }
298     { cmdsize    uint32_t } ;
299
300 STRUCT: routines_command
301     { cmd             uint32_t }
302     { cmdsize         uint32_t }
303     { init_address    uint32_t }
304     { init_module     uint32_t }
305     { reserved1       uint32_t }
306     { reserved2       uint32_t }
307     { reserved3       uint32_t }
308     { reserved4       uint32_t }
309     { reserved5       uint32_t }
310     { reserved6       uint32_t } ;
311
312 STRUCT: routines_command_64
313     { cmd             uint32_t }
314     { cmdsize         uint32_t }
315     { init_address    uint64_t }
316     { init_module     uint64_t }
317     { reserved1       uint64_t }
318     { reserved2       uint64_t }
319     { reserved3       uint64_t }
320     { reserved4       uint64_t }
321     { reserved5       uint64_t }
322     { reserved6       uint64_t } ;
323
324 STRUCT: symtab_command
325     { cmd        uint32_t }
326     { cmdsize    uint32_t }
327     { symoff     uint32_t }
328     { nsyms      uint32_t }
329     { stroff     uint32_t }
330     { strsize    uint32_t } ;
331
332 STRUCT: dysymtab_command
333     { cmd            uint32_t }
334     { cmdsize        uint32_t }
335     { ilocalsym      uint32_t }
336     { nlocalsym      uint32_t }
337     { iextdefsym     uint32_t }
338     { nextdefsym     uint32_t }
339     { iundefsym      uint32_t }
340     { nundefsym      uint32_t }
341     { tocoff         uint32_t }
342     { ntoc           uint32_t }
343     { modtaboff      uint32_t }
344     { nmodtab        uint32_t }
345     { extrefsymoff   uint32_t }
346     { nextrefsyms    uint32_t }
347     { indirectsymoff uint32_t }
348     { nindirectsyms  uint32_t }
349     { extreloff      uint32_t }
350     { nextrel        uint32_t }
351     { locreloff      uint32_t }
352     { nlocrel        uint32_t } ;
353
354 CONSTANT: INDIRECT_SYMBOL_LOCAL HEX: 80000000
355 CONSTANT: INDIRECT_SYMBOL_ABS   HEX: 40000000
356
357 STRUCT: dylib_table_of_contents
358     { symbol_index uint32_t }
359     { module_index uint32_t } ;
360
361 STRUCT: dylib_module
362     { module_name           uint32_t }
363     { iextdefsym            uint32_t }
364     { nextdefsym            uint32_t }
365     { irefsym               uint32_t }
366     { nrefsym               uint32_t }
367     { ilocalsym             uint32_t }
368     { nlocalsym             uint32_t }
369     { iextrel               uint32_t }
370     { nextrel               uint32_t }
371     { iinit_iterm           uint32_t }
372     { ninit_nterm           uint32_t }
373     { objc_module_info_addr uint32_t }
374     { objc_module_info_size uint32_t } ;
375
376 STRUCT: dylib_module_64
377     { module_name           uint32_t }
378     { iextdefsym            uint32_t }
379     { nextdefsym            uint32_t }
380     { irefsym               uint32_t }
381     { nrefsym               uint32_t }
382     { ilocalsym             uint32_t }
383     { nlocalsym             uint32_t }
384     { iextrel               uint32_t }
385     { nextrel               uint32_t }
386     { iinit_iterm           uint32_t }
387     { ninit_nterm           uint32_t }
388     { objc_module_info_size uint32_t }
389     { objc_module_info_addr uint64_t } ;
390
391 STRUCT: dylib_reference
392     { isym_flags uint32_t } ;
393
394 STRUCT: twolevel_hints_command
395     { cmd     uint32_t }
396     { cmdsize uint32_t }
397     { offset  uint32_t }
398     { nhints  uint32_t } ;
399
400 STRUCT: twolevel_hint
401     { isub_image_itoc uint32_t } ;
402
403 STRUCT: prebind_cksum_command
404     { cmd     uint32_t }
405     { cmdsize uint32_t }
406     { cksum   uint32_t } ;
407
408 STRUCT: uuid_command
409     { cmd        uint32_t    }
410     { cmdsize    uint32_t    }
411     { uuid       uint8_t[16] } ;
412
413 STRUCT: rpath_command
414     { cmd         uint32_t }
415     { cmdsize     uint32_t }
416     { path        lc_str   } ;
417
418 STRUCT: linkedit_data_command
419     { cmd         uint32_t }
420     { cmdsize     uint32_t }
421     { dataoff     uint32_t }
422     { datasize    uint32_t } ;
423
424 STRUCT: encryption_info_command
425     { cmd       uint32_t }
426     { cmdsize   uint32_t }
427     { cryptoff  uint32_t }
428     { cryptsize uint32_t }
429     { cryptid   uint32_t } ;
430
431 STRUCT: dyld_info_command
432     { cmd              uint32_t }
433     { cmdsize          uint32_t }
434     { rebase_off       uint32_t }
435     { rebase_size      uint32_t }
436     { bind_off         uint32_t }
437     { bind_size        uint32_t }
438     { weak_bind_off    uint32_t }
439     { weak_bind_size   uint32_t }
440     { lazy_bind_off    uint32_t }
441     { lazy_bind_size   uint32_t }
442     { export_off       uint32_t }
443     { export_size      uint32_t } ;
444
445 CONSTANT: REBASE_TYPE_POINTER                     1
446 CONSTANT: REBASE_TYPE_TEXT_ABSOLUTE32             2
447 CONSTANT: REBASE_TYPE_TEXT_PCREL32                3
448
449 CONSTANT: REBASE_OPCODE_MASK                                  HEX: F0
450 CONSTANT: REBASE_IMMEDIATE_MASK                               HEX: 0F
451 CONSTANT: REBASE_OPCODE_DONE                                  HEX: 00
452 CONSTANT: REBASE_OPCODE_SET_TYPE_IMM                          HEX: 10
453 CONSTANT: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB           HEX: 20
454 CONSTANT: REBASE_OPCODE_ADD_ADDR_ULEB                         HEX: 30
455 CONSTANT: REBASE_OPCODE_ADD_ADDR_IMM_SCALED                   HEX: 40
456 CONSTANT: REBASE_OPCODE_DO_REBASE_IMM_TIMES                   HEX: 50
457 CONSTANT: REBASE_OPCODE_DO_REBASE_ULEB_TIMES                  HEX: 60
458 CONSTANT: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB               HEX: 70
459 CONSTANT: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB    HEX: 80
460
461 CONSTANT: BIND_TYPE_POINTER                       1
462 CONSTANT: BIND_TYPE_TEXT_ABSOLUTE32               2
463 CONSTANT: BIND_TYPE_TEXT_PCREL32                  3
464
465 CONSTANT: BIND_SPECIAL_DYLIB_SELF                     0
466 CONSTANT: BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE          -1
467 CONSTANT: BIND_SPECIAL_DYLIB_FLAT_LOOKUP              -2
468
469 CONSTANT: BIND_SYMBOL_FLAGS_WEAK_IMPORT                   HEX: 1
470 CONSTANT: BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION           HEX: 8
471
472 CONSTANT: BIND_OPCODE_MASK                                    HEX: F0
473 CONSTANT: BIND_IMMEDIATE_MASK                                 HEX: 0F
474 CONSTANT: BIND_OPCODE_DONE                                    HEX: 00
475 CONSTANT: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM                   HEX: 10
476 CONSTANT: BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB                  HEX: 20
477 CONSTANT: BIND_OPCODE_SET_DYLIB_SPECIAL_IMM                   HEX: 30
478 CONSTANT: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM           HEX: 40
479 CONSTANT: BIND_OPCODE_SET_TYPE_IMM                            HEX: 50
480 CONSTANT: BIND_OPCODE_SET_ADDEND_SLEB                         HEX: 60
481 CONSTANT: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB             HEX: 70
482 CONSTANT: BIND_OPCODE_ADD_ADDR_ULEB                           HEX: 80
483 CONSTANT: BIND_OPCODE_DO_BIND                                 HEX: 90
484 CONSTANT: BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB                   HEX: A0
485 CONSTANT: BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED             HEX: B0
486 CONSTANT: BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB        HEX: C0
487
488 CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_MASK                   HEX: 03
489 CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_REGULAR                HEX: 00
490 CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL           HEX: 01
491 CONSTANT: EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION             HEX: 04
492 CONSTANT: EXPORT_SYMBOL_FLAGS_INDIRECT_DEFINITION         HEX: 08
493 CONSTANT: EXPORT_SYMBOL_FLAGS_HAS_SPECIALIZATIONS         HEX: 10
494
495 STRUCT: symseg_command
496     { cmd        uint32_t }
497     { cmdsize    uint32_t }
498     { offset     uint32_t }
499     { size       uint32_t } ;
500
501 STRUCT: ident_command
502     { cmd     uint32_t }
503     { cmdsize uint32_t } ;
504
505 STRUCT: fvmfile_command
506     { cmd            uint32_t }
507     { cmdsize        uint32_t }
508     { name           lc_str   }
509     { header_addr    uint32_t } ;
510
511 ! machine.h
512 CONSTANT: CPU_STATE_MAX       4
513 CONSTANT: CPU_STATE_USER      0
514 CONSTANT: CPU_STATE_SYSTEM    1
515 CONSTANT: CPU_STATE_IDLE      2
516 CONSTANT: CPU_STATE_NICE      3
517
518 CONSTANT: CPU_ARCH_MASK   HEX: ff000000
519 CONSTANT: CPU_ARCH_ABI64  HEX: 01000000
520
521 CONSTANT: CPU_TYPE_ANY            -1
522 CONSTANT: CPU_TYPE_VAX            1
523 CONSTANT: CPU_TYPE_MC680x0        6
524 CONSTANT: CPU_TYPE_X86            7
525 CONSTANT: CPU_TYPE_I386           $ CPU_TYPE_X86
526 CONSTANT: CPU_TYPE_X86_64         $[ $ CPU_TYPE_X86 $ CPU_ARCH_ABI64 bitor ]
527 CONSTANT: CPU_TYPE_MC98000        10
528 CONSTANT: CPU_TYPE_HPPA           11
529 CONSTANT: CPU_TYPE_ARM            12
530 CONSTANT: CPU_TYPE_MC88000        13
531 CONSTANT: CPU_TYPE_SPARC          14
532 CONSTANT: CPU_TYPE_I860           15
533 CONSTANT: CPU_TYPE_POWERPC        18
534 CONSTANT: CPU_TYPE_POWERPC64      $[ $ CPU_TYPE_POWERPC $ CPU_ARCH_ABI64 bitor ]
535
536 CONSTANT: CPU_SUBTYPE_MASK    HEX: ff000000
537 CONSTANT: CPU_SUBTYPE_LIB64   HEX: 80000000
538
539 CONSTANT: CPU_SUBTYPE_MULTIPLE        -1
540 CONSTANT: CPU_SUBTYPE_LITTLE_ENDIAN   0
541 CONSTANT: CPU_SUBTYPE_BIG_ENDIAN      1
542
543 CONSTANT: CPU_THREADTYPE_NONE     0
544
545 CONSTANT: CPU_SUBTYPE_VAX_ALL 0
546 CONSTANT: CPU_SUBTYPE_VAX780  1
547 CONSTANT: CPU_SUBTYPE_VAX785  2
548 CONSTANT: CPU_SUBTYPE_VAX750  3
549 CONSTANT: CPU_SUBTYPE_VAX730  4
550 CONSTANT: CPU_SUBTYPE_UVAXI   5
551 CONSTANT: CPU_SUBTYPE_UVAXII  6
552 CONSTANT: CPU_SUBTYPE_VAX8200 7
553 CONSTANT: CPU_SUBTYPE_VAX8500 8
554 CONSTANT: CPU_SUBTYPE_VAX8600 9
555 CONSTANT: CPU_SUBTYPE_VAX8650 10
556 CONSTANT: CPU_SUBTYPE_VAX8800 11
557 CONSTANT: CPU_SUBTYPE_UVAXIII 12
558
559 CONSTANT: CPU_SUBTYPE_MC680x0_ALL     1
560 CONSTANT: CPU_SUBTYPE_MC68030     1
561 CONSTANT: CPU_SUBTYPE_MC68040     2
562 CONSTANT: CPU_SUBTYPE_MC68030_ONLY    3
563
564 : CPU_SUBTYPE_INTEL ( f m -- subtype ) 4 shift + ; inline
565
566 CONSTANT: CPU_SUBTYPE_I386_ALL              3
567 CONSTANT: CPU_SUBTYPE_386                   3
568 CONSTANT: CPU_SUBTYPE_486                   4
569 CONSTANT: CPU_SUBTYPE_486SX                 132
570 CONSTANT: CPU_SUBTYPE_586                   5
571 CONSTANT: CPU_SUBTYPE_PENT                  5
572 CONSTANT: CPU_SUBTYPE_PENTPRO               22
573 CONSTANT: CPU_SUBTYPE_PENTII_M3             54
574 CONSTANT: CPU_SUBTYPE_PENTII_M5             86
575 CONSTANT: CPU_SUBTYPE_CELERON               103
576 CONSTANT: CPU_SUBTYPE_CELERON_MOBILE        119
577 CONSTANT: CPU_SUBTYPE_PENTIUM_3             8
578 CONSTANT: CPU_SUBTYPE_PENTIUM_3_M           24
579 CONSTANT: CPU_SUBTYPE_PENTIUM_3_XEON        40
580 CONSTANT: CPU_SUBTYPE_PENTIUM_M             9
581 CONSTANT: CPU_SUBTYPE_PENTIUM_4             10
582 CONSTANT: CPU_SUBTYPE_PENTIUM_4_M           26
583 CONSTANT: CPU_SUBTYPE_ITANIUM               11
584 CONSTANT: CPU_SUBTYPE_ITANIUM_2             27
585 CONSTANT: CPU_SUBTYPE_XEON                  12
586 CONSTANT: CPU_SUBTYPE_XEON_MP               28
587
588 : CPU_SUBTYPE_INTEL_FAMILY ( x -- family ) 15 bitand ; inline
589
590 CONSTANT: CPU_SUBTYPE_INTEL_FAMILY_MAX    15
591
592 : CPU_SUBTYPE_INTEL_MODEL ( x -- model ) -4 shift ; inline
593
594 CONSTANT: CPU_SUBTYPE_INTEL_MODEL_ALL 0
595 CONSTANT: CPU_SUBTYPE_X86_ALL         3
596 CONSTANT: CPU_SUBTYPE_X86_64_ALL      3
597 CONSTANT: CPU_SUBTYPE_X86_ARCH1       4
598 CONSTANT: CPU_THREADTYPE_INTEL_HTT    1
599
600 CONSTANT: CPU_SUBTYPE_MIPS_ALL    0
601 CONSTANT: CPU_SUBTYPE_MIPS_R2300  1
602 CONSTANT: CPU_SUBTYPE_MIPS_R2600  2
603 CONSTANT: CPU_SUBTYPE_MIPS_R2800  3
604 CONSTANT: CPU_SUBTYPE_MIPS_R2000a 4
605 CONSTANT: CPU_SUBTYPE_MIPS_R2000  5
606 CONSTANT: CPU_SUBTYPE_MIPS_R3000a 6
607 CONSTANT: CPU_SUBTYPE_MIPS_R3000  7
608
609 CONSTANT: CPU_SUBTYPE_MC98000_ALL 0
610 CONSTANT: CPU_SUBTYPE_MC98601     1
611
612 CONSTANT: CPU_SUBTYPE_HPPA_ALL        0
613 CONSTANT: CPU_SUBTYPE_HPPA_7100       0
614 CONSTANT: CPU_SUBTYPE_HPPA_7100LC     1
615
616 CONSTANT: CPU_SUBTYPE_MC88000_ALL 0
617 CONSTANT: CPU_SUBTYPE_MC88100     1
618 CONSTANT: CPU_SUBTYPE_MC88110     2
619
620 CONSTANT: CPU_SUBTYPE_SPARC_ALL       0
621
622 CONSTANT: CPU_SUBTYPE_I860_ALL    0
623 CONSTANT: CPU_SUBTYPE_I860_860    1
624
625 CONSTANT: CPU_SUBTYPE_POWERPC_ALL     0
626 CONSTANT: CPU_SUBTYPE_POWERPC_601     1
627 CONSTANT: CPU_SUBTYPE_POWERPC_602     2
628 CONSTANT: CPU_SUBTYPE_POWERPC_603     3
629 CONSTANT: CPU_SUBTYPE_POWERPC_603e    4
630 CONSTANT: CPU_SUBTYPE_POWERPC_603ev   5
631 CONSTANT: CPU_SUBTYPE_POWERPC_604     6
632 CONSTANT: CPU_SUBTYPE_POWERPC_604e    7
633 CONSTANT: CPU_SUBTYPE_POWERPC_620     8
634 CONSTANT: CPU_SUBTYPE_POWERPC_750     9
635 CONSTANT: CPU_SUBTYPE_POWERPC_7400    10
636 CONSTANT: CPU_SUBTYPE_POWERPC_7450    11
637 CONSTANT: CPU_SUBTYPE_POWERPC_970     100
638
639 CONSTANT: CPU_SUBTYPE_ARM_ALL             0
640 CONSTANT: CPU_SUBTYPE_ARM_V4T             5
641 CONSTANT: CPU_SUBTYPE_ARM_V6              6
642 CONSTANT: CPU_SUBTYPE_ARM_V5TEJ           7
643 CONSTANT: CPU_SUBTYPE_ARM_XSCALE          8
644 CONSTANT: CPU_SUBTYPE_ARM_V7              9
645
646 CONSTANT: CPUFAMILY_UNKNOWN    0
647 CONSTANT: CPUFAMILY_POWERPC_G3 HEX: cee41549
648 CONSTANT: CPUFAMILY_POWERPC_G4 HEX: 77c184ae
649 CONSTANT: CPUFAMILY_POWERPC_G5 HEX: ed76d8aa
650 CONSTANT: CPUFAMILY_INTEL_6_13 HEX: aa33392b
651 CONSTANT: CPUFAMILY_INTEL_6_14 HEX: 73d67300
652 CONSTANT: CPUFAMILY_INTEL_6_15 HEX: 426f69ef
653 CONSTANT: CPUFAMILY_INTEL_6_23 HEX: 78ea4fbc
654 CONSTANT: CPUFAMILY_INTEL_6_26 HEX: 6b5a4cd2
655 CONSTANT: CPUFAMILY_ARM_9      HEX: e73283ae
656 CONSTANT: CPUFAMILY_ARM_11     HEX: 8ff620d8
657 CONSTANT: CPUFAMILY_ARM_XSCALE HEX: 53b005f5
658 CONSTANT: CPUFAMILY_ARM_13     HEX: 0cc90e64
659
660 CONSTANT: CPUFAMILY_INTEL_YONAH   $ CPUFAMILY_INTEL_6_14
661 CONSTANT: CPUFAMILY_INTEL_MEROM   $ CPUFAMILY_INTEL_6_15
662 CONSTANT: CPUFAMILY_INTEL_PENRYN  $ CPUFAMILY_INTEL_6_23
663 CONSTANT: CPUFAMILY_INTEL_NEHALEM $ CPUFAMILY_INTEL_6_26
664
665 CONSTANT: CPUFAMILY_INTEL_CORE    $ CPUFAMILY_INTEL_6_14
666 CONSTANT: CPUFAMILY_INTEL_CORE2   $ CPUFAMILY_INTEL_6_15
667
668 ! fat.h
669 CONSTANT: FAT_MAGIC HEX: cafebabe
670 CONSTANT: FAT_CIGAM HEX: bebafeca
671
672 STRUCT: fat_header
673     { magic        uint32_t }
674     { nfat_arch    uint32_t } ;
675
676 STRUCT: fat_arch
677     { cputype      cpu_type_t    }
678     { cpusubtype   cpu_subtype_t }
679     { offset       uint32_t      }
680     { size         uint32_t      }
681     { align        uint32_t      } ;
682
683 ! nlist.h
684 STRUCT: nlist
685     { n_strx  int32_t  }
686     { n_type  uint8_t  }
687     { n_sect  uint8_t  }
688     { n_desc  int16_t  }
689     { n_value uint32_t } ;
690
691 STRUCT: nlist_64
692     { n_strx  uint32_t }
693     { n_type  uint8_t  }
694     { n_sect  uint8_t  }
695     { n_desc  uint16_t }
696     { n_value uint64_t } ;
697
698 CONSTANT: N_STAB  HEX: e0
699 CONSTANT: N_PEXT  HEX: 10
700 CONSTANT: N_TYPE  HEX: 0e
701 CONSTANT: N_EXT   HEX: 01
702
703 CONSTANT: N_UNDF  HEX: 0
704 CONSTANT: N_ABS   HEX: 2
705 CONSTANT: N_SECT  HEX: e
706 CONSTANT: N_PBUD  HEX: c
707 CONSTANT: N_INDR  HEX: a
708
709 CONSTANT: NO_SECT     0
710 CONSTANT: MAX_SECT    255
711
712 : GET_COMM_ALIGN ( n_desc -- align )
713     -8 shift HEX: 0f bitand ; inline
714
715 : SET_COMM_ALIGN ( n_desc align -- n_desc )
716     [ HEX: f0ff bitand ]
717     [ HEX: 000f bitand 8 shift ] bi* bitor ; inline
718
719 CONSTANT: REFERENCE_TYPE                              7
720 CONSTANT: REFERENCE_FLAG_UNDEFINED_NON_LAZY           0
721 CONSTANT: REFERENCE_FLAG_UNDEFINED_LAZY               1
722 CONSTANT: REFERENCE_FLAG_DEFINED                      2
723 CONSTANT: REFERENCE_FLAG_PRIVATE_DEFINED              3
724 CONSTANT: REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY   4
725 CONSTANT: REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY       5
726
727 CONSTANT: REFERENCED_DYNAMICALLY  HEX: 0010
728
729 : GET_LIBRARY_ORDINAL ( n_desc -- ordinal )
730     -8 shift HEX: ff bitand ; inline
731
732 : SET_LIBRARY_ORDINAL ( n_desc ordinal -- n_desc )
733     [ HEX: 00ff bitand ]
734     [ HEX: 00ff bitand 8 shift ] bi* bitor ; inline
735
736 CONSTANT: SELF_LIBRARY_ORDINAL   HEX: 0
737 CONSTANT: MAX_LIBRARY_ORDINAL    HEX: fd
738 CONSTANT: DYNAMIC_LOOKUP_ORDINAL HEX: fe
739 CONSTANT: EXECUTABLE_ORDINAL     HEX: ff
740
741 CONSTANT: N_NO_DEAD_STRIP  HEX: 0020
742 CONSTANT: N_DESC_DISCARDED HEX: 0020
743 CONSTANT: N_WEAK_REF       HEX: 0040
744 CONSTANT: N_WEAK_DEF       HEX: 0080
745 CONSTANT: N_REF_TO_WEAK    HEX: 0080
746 CONSTANT: N_ARM_THUMB_DEF  HEX: 0008
747
748 ! ranlib.h
749 CONSTANT: SYMDEF        "__.SYMDEF"
750 CONSTANT: SYMDEF_SORTED "__.SYMDEF SORTED"
751
752 STRUCT: ranlib
753     { ran_strx uint32_t }
754     { ran_off  uint32_t } ;
755
756 ! reloc.h
757 STRUCT: relocation_info
758     { r_address                            int32_t  }
759     { r_symbolnum_pcrel_length_extern_type uint32_t } ;
760
761 CONSTANT: R_ABS   0
762 CONSTANT: R_SCATTERED HEX: 80000000
763
764 STRUCT: scattered_relocation_info_big_endian
765     { r_scattered_pcrel_length_type_address  uint32_t }
766     { r_value                                int32_t  } ;
767
768 STRUCT: scattered_relocation_info_little_endian
769     { r_address_type_length_pcrel_scattered uint32_t }
770     { r_value                               int32_t  } ;
771
772 C-ENUM: reloc_type_generic
773     GENERIC_RELOC_VANILLA
774     GENERIC_RELOC_PAIR
775     GENERIC_RELOC_SECTDIFF
776     GENERIC_RELOC_PB_LA_PTR
777     GENERIC_RELOC_LOCAL_SECTDIFF ;
778
779 C-ENUM: reloc_type_x86_64
780     X86_64_RELOC_UNSIGNED
781     X86_64_RELOC_SIGNED
782     X86_64_RELOC_BRANCH
783     X86_64_RELOC_GOT_LOAD
784     X86_64_RELOC_GOT
785     X86_64_RELOC_SUBTRACTOR
786     X86_64_RELOC_SIGNED_1
787     X86_64_RELOC_SIGNED_2
788     X86_64_RELOC_SIGNED_4 ;
789
790 C-ENUM: reloc_type_ppc
791     PPC_RELOC_VANILLA
792     PPC_RELOC_PAIR
793     PPC_RELOC_BR14
794     PPC_RELOC_BR24
795     PPC_RELOC_HI16
796     PPC_RELOC_LO16
797     PPC_RELOC_HA16
798     PPC_RELOC_LO14
799     PPC_RELOC_SECTDIFF
800     PPC_RELOC_PB_LA_PTR
801     PPC_RELOC_HI16_SECTDIFF
802     PPC_RELOC_LO16_SECTDIFF
803     PPC_RELOC_HA16_SECTDIFF
804     PPC_RELOC_JBSR
805     PPC_RELOC_LO14_SECTDIFF
806     PPC_RELOC_LOCAL_SECTDIFF ;