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