]> gitweb.factorcode.org Git - factor.git/commitdiff
Mach-O FFI constants and data structures.
authorErik Charlebois <erikcharlebois@gmail.com>
Tue, 6 Apr 2010 09:44:57 +0000 (02:44 -0700)
committerErik Charlebois <erikcharlebois@gmail.com>
Tue, 6 Apr 2010 09:44:57 +0000 (02:44 -0700)
extra/macho/authors.txt [new file with mode: 0644]
extra/macho/macho.factor [new file with mode: 0644]
extra/macho/summary.txt [new file with mode: 0644]

diff --git a/extra/macho/authors.txt b/extra/macho/authors.txt
new file mode 100644 (file)
index 0000000..6f03a12
--- /dev/null
@@ -0,0 +1 @@
+Erik Charlebois
diff --git a/extra/macho/macho.factor b/extra/macho/macho.factor
new file mode 100644 (file)
index 0000000..fbccab3
--- /dev/null
@@ -0,0 +1,810 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http:// factorcode.org/license.txt for BSD license.
+USING: alien.c-types alien.syntax classes.struct kernel literals math
+unix.types ;
+IN: macho
+
+TYPEDEF: int       integer_t
+TYPEDEF: int       vm_prot_t
+TYPEDEF: integer_t cpu_type_t
+TYPEDEF: integer_t cpu_subtype_t
+TYPEDEF: integer_t cpu_threadtype_t
+
+CONSTANT: VM_PROT_NONE        HEX: 00
+CONSTANT: VM_PROT_READ        HEX: 01
+CONSTANT: VM_PROT_WRITE       HEX: 02
+CONSTANT: VM_PROT_EXECUTE     HEX: 04
+CONSTANT: VM_PROT_DEFAULT     HEX: 03
+CONSTANT: VM_PROT_ALL         HEX: 07
+CONSTANT: VM_PROT_NO_CHANGE   HEX: 08
+CONSTANT: VM_PROT_COPY        HEX: 10
+CONSTANT: VM_PROT_WANTS_COPY  HEX: 10
+
+! loader.h
+STRUCT: mach_header
+    { magic         uint32_t      }
+    { cputype       cpu_type_t    }
+    { cpusubtype    cpu_subtype_t }
+    { filetype      uint32_t      }
+    { ncmds         uint32_t      }
+    { sizeofcmds    uint32_t      }
+    { flags         uint32_t      } ;
+
+CONSTANT: MH_MAGIC    HEX: feedface
+CONSTANT: MH_CIGAM    HEX: cefaedfe
+
+STRUCT: mach_header_64
+    { magic         uint32_t      }
+    { cputype       cpu_type_t    }
+    { cpusubtype    cpu_subtype_t }
+    { filetype      uint32_t      }
+    { ncmds         uint32_t      }
+    { sizeofcmds    uint32_t      }
+    { flags         uint32_t      }
+    { reserved      uint32_t      } ;
+
+CONSTANT: MH_MAGIC_64 HEX: feedfacf
+CONSTANT: MH_CIGAM_64 HEX: cffaedfe
+
+CONSTANT: MH_OBJECT       HEX: 1
+CONSTANT: MH_EXECUTE      HEX: 2
+CONSTANT: MH_FVMLIB       HEX: 3
+CONSTANT: MH_CORE         HEX: 4
+CONSTANT: MH_PRELOAD      HEX: 5
+CONSTANT: MH_DYLIB        HEX: 6
+CONSTANT: MH_DYLINKER     HEX: 7
+CONSTANT: MH_BUNDLE       HEX: 8
+CONSTANT: MH_DYLIB_STUB   HEX: 9
+CONSTANT: MH_DSYM         HEX: a
+CONSTANT: MH_KEXT_BUNDLE  HEX: b
+
+CONSTANT: MH_NOUNDEFS                HEX: 1
+CONSTANT: MH_INCRLINK                HEX: 2
+CONSTANT: MH_DYLDLINK                HEX: 4
+CONSTANT: MH_BINDATLOAD              HEX: 8
+CONSTANT: MH_PREBOUND                HEX: 10
+CONSTANT: MH_SPLIT_SEGS              HEX: 20
+CONSTANT: MH_LAZY_INIT               HEX: 40
+CONSTANT: MH_TWOLEVEL                HEX: 80
+CONSTANT: MH_FORCE_FLAT              HEX: 100
+CONSTANT: MH_NOMULTIDEFS             HEX: 200
+CONSTANT: MH_NOFIXPREBINDING         HEX: 400
+CONSTANT: MH_PREBINDABLE             HEX: 800
+CONSTANT: MH_ALLMODSBOUND            HEX: 1000
+CONSTANT: MH_SUBSECTIONS_VIA_SYMBOLS HEX: 2000
+CONSTANT: MH_CANONICAL               HEX: 4000
+CONSTANT: MH_WEAK_DEFINES            HEX: 8000
+CONSTANT: MH_BINDS_TO_WEAK           HEX: 10000
+CONSTANT: MH_ALLOW_STACK_EXECUTION   HEX: 20000
+CONSTANT: MH_DEAD_STRIPPABLE_DYLIB   HEX: 400000
+CONSTANT: MH_ROOT_SAFE               HEX: 40000
+CONSTANT: MH_SETUID_SAFE             HEX: 80000
+CONSTANT: MH_NO_REEXPORTED_DYLIBS    HEX: 100000
+CONSTANT: MH_PIE                     HEX: 200000
+
+STRUCT: load_command
+    { cmd     uint32_t }
+    { cmdsize uint32_t } ;
+
+CONSTANT: LC_REQ_DYLD HEX: 80000000
+
+CONSTANT: LC_SEGMENT            HEX: 1
+CONSTANT: LC_SYMTAB             HEX: 2
+CONSTANT: LC_SYMSEG             HEX: 3
+CONSTANT: LC_THREAD             HEX: 4
+CONSTANT: LC_UNIXTHREAD         HEX: 5
+CONSTANT: LC_LOADFVMLIB         HEX: 6
+CONSTANT: LC_IDFVMLIB           HEX: 7
+CONSTANT: LC_IDENT              HEX: 8
+CONSTANT: LC_FVMFILE            HEX: 9
+CONSTANT: LC_PREPAGE            HEX: a
+CONSTANT: LC_DYSYMTAB           HEX: b
+CONSTANT: LC_LOAD_DYLIB         HEX: c
+CONSTANT: LC_ID_DYLIB           HEX: d
+CONSTANT: LC_LOAD_DYLINKER      HEX: e
+CONSTANT: LC_ID_DYLINKER        HEX: f
+CONSTANT: LC_PREBOUND_DYLIB     HEX: 10
+CONSTANT: LC_ROUTINES           HEX: 11
+CONSTANT: LC_SUB_FRAMEWORK      HEX: 12
+CONSTANT: LC_SUB_UMBRELLA       HEX: 13
+CONSTANT: LC_SUB_CLIENT         HEX: 14
+CONSTANT: LC_SUB_LIBRARY        HEX: 15
+CONSTANT: LC_TWOLEVEL_HINTS     HEX: 16
+CONSTANT: LC_PREBIND_CKSUM      HEX: 17
+CONSTANT: LC_LOAD_WEAK_DYLIB    HEX: 80000018
+CONSTANT: LC_SEGMENT_64         HEX: 19
+CONSTANT: LC_ROUTINES_64        HEX: 1a
+CONSTANT: LC_UUID               HEX: 1b
+CONSTANT: LC_RPATH              HEX: 8000001c
+CONSTANT: LC_CODE_SIGNATURE     HEX: 1d
+CONSTANT: LC_SEGMENT_SPLIT_INFO HEX: 1e
+CONSTANT: LC_REEXPORT_DYLIB     HEX: 8000001f
+CONSTANT: LC_LAZY_LOAD_DYLIB    HEX: 20
+CONSTANT: LC_ENCRYPTION_INFO    HEX: 21
+CONSTANT: LC_DYLD_INFO          HEX: 22
+CONSTANT: LC_DYLD_INFO_ONLY     HEX: 80000022
+
+UNION-STRUCT: lc_str
+    { offset    uint32_t }
+    { ptr       char*    } ;
+
+STRUCT: segment_command
+    { cmd            uint32_t  }
+    { cmdsize        uint32_t  }
+    { segname        char[16]  }
+    { vmaddr         uint32_t  }
+    { vmsize         uint32_t  }
+    { fileoff        uint32_t  }
+    { filesize       uint32_t  }
+    { maxprot        vm_prot_t }
+    { initprot       vm_prot_t }
+    { nsects         uint32_t  }
+    { flags          uint32_t  } ;
+
+STRUCT: segment_command_64
+    { cmd            uint32_t  }
+    { cmdsize        uint32_t  }
+    { segname        char[16]  }
+    { vmaddr         uint64_t  }
+    { vmsize         uint64_t  }
+    { fileoff        uint64_t  }
+    { filesize       uint64_t  }
+    { maxprot        vm_prot_t }
+    { initprot       vm_prot_t }
+    { nsects         uint32_t  }
+    { flags          uint32_t  } ;
+
+CONSTANT: SG_HIGHVM               HEX: 1
+CONSTANT: SG_FVMLIB               HEX: 2
+CONSTANT: SG_NORELOC              HEX: 4
+CONSTANT: SG_PROTECTED_VERSION_1  HEX: 8
+
+STRUCT: section
+    { sectname        char[16] }
+    { segname         char[16] }
+    { addr            uint32_t }
+    { size            uint32_t }
+    { offset          uint32_t }
+    { align           uint32_t }
+    { reloff          uint32_t }
+    { nreloc          uint32_t }
+    { flags           uint32_t }
+    { reserved1       uint32_t }
+    { reserved2       uint32_t } ;
+
+STRUCT: section_64
+    { sectname        char[16] }
+    { segname         char[16] }
+    { addr            uint64_t }
+    { size            uint64_t }
+    { offset          uint32_t }
+    { align           uint32_t }
+    { reloff          uint32_t }
+    { nreloc          uint32_t }
+    { flags           uint32_t }
+    { reserved1       uint32_t }
+    { reserved2       uint32_t }
+    { reserved3       uint32_t } ;
+
+CONSTANT: SECTION_TYPE         HEX: 000000ff
+CONSTANT: SECTION_ATTRIBUTES   HEX: ffffff00
+
+CONSTANT: S_REGULAR                       HEX: 0
+CONSTANT: S_ZEROFILL                      HEX: 1
+CONSTANT: S_CSTRING_LITERALS              HEX: 2
+CONSTANT: S_4BYTE_LITERALS                HEX: 3
+CONSTANT: S_8BYTE_LITERALS                HEX: 4
+CONSTANT: S_LITERAL_POINTERS              HEX: 5
+CONSTANT: S_NON_LAZY_SYMBOL_POINTERS      HEX: 6
+CONSTANT: S_LAZY_SYMBOL_POINTERS          HEX: 7
+CONSTANT: S_SYMBOL_STUBS                  HEX: 8
+CONSTANT: S_MOD_INIT_FUNC_POINTERS        HEX: 9
+CONSTANT: S_MOD_TERM_FUNC_POINTERS        HEX: a
+CONSTANT: S_COALESCED                     HEX: b
+CONSTANT: S_GB_ZEROFILL                   HEX: c
+CONSTANT: S_INTERPOSING                   HEX: d
+CONSTANT: S_16BYTE_LITERALS               HEX: e
+CONSTANT: S_DTRACE_DOF                    HEX: f
+CONSTANT: S_LAZY_DYLIB_SYMBOL_POINTERS    HEX: 10
+
+CONSTANT: SECTION_ATTRIBUTES_USR     HEX: ff000000
+CONSTANT: S_ATTR_PURE_INSTRUCTIONS   HEX: 80000000
+CONSTANT: S_ATTR_NO_TOC              HEX: 40000000
+CONSTANT: S_ATTR_STRIP_STATIC_SYMS   HEX: 20000000
+CONSTANT: S_ATTR_NO_DEAD_STRIP       HEX: 10000000
+CONSTANT: S_ATTR_LIVE_SUPPORT        HEX: 08000000
+CONSTANT: S_ATTR_SELF_MODIFYING_CODE HEX: 04000000
+CONSTANT: S_ATTR_DEBUG               HEX: 02000000
+CONSTANT: SECTION_ATTRIBUTES_SYS     HEX: 00ffff00
+CONSTANT: S_ATTR_SOME_INSTRUCTIONS   HEX: 00000400
+CONSTANT: S_ATTR_EXT_RELOC           HEX: 00000200
+CONSTANT: S_ATTR_LOC_RELOC           HEX: 00000100
+
+CONSTANT: SEG_PAGEZERO      "__PAGEZERO"
+CONSTANT: SEG_TEXT          "__TEXT"
+CONSTANT: SECT_TEXT         "__text"
+CONSTANT: SECT_FVMLIB_INIT0 "__fvmlib_init0"
+CONSTANT: SECT_FVMLIB_INIT1 "__fvmlib_init1"
+CONSTANT: SEG_DATA          "__DATA"
+CONSTANT: SECT_DATA         "__data"
+CONSTANT: SECT_BSS          "__bss"
+CONSTANT: SECT_COMMON       "__common"
+CONSTANT: SEG_OBJC          "__OBJC"
+CONSTANT: SECT_OBJC_SYMBOLS "__symbol_table"
+CONSTANT: SECT_OBJC_MODULES "__module_info"
+CONSTANT: SECT_OBJC_STRINGS "__selector_strs"
+CONSTANT: SECT_OBJC_REFS    "__selector_refs"
+CONSTANT: SEG_ICON          "__ICON"
+CONSTANT: SECT_ICON_HEADER  "__header"
+CONSTANT: SECT_ICON_TIFF    "__tiff"
+CONSTANT: SEG_LINKEDIT      "__LINKEDIT"
+CONSTANT: SEG_UNIXSTACK     "__UNIXSTACK"
+CONSTANT: SEG_IMPORT        "__IMPORT"
+
+STRUCT: fvmlib
+    { name             lc_str   }
+    { minor_version    uint32_t }
+    { header_addr      uint32_t } ;
+
+STRUCT: fvmlib_command
+    { cmd        uint32_t }
+    { cmdsize    uint32_t }
+    { fvmlib     fvmlib   } ;
+
+STRUCT: dylib
+    { name                  lc_str   }
+    { timestamp             uint32_t }
+    { current_version       uint32_t }
+    { compatibility_version uint32_t } ;
+
+STRUCT: dylib_command
+    { cmd        uint32_t }
+    { cmdsize    uint32_t }
+    { dylib      dylib    } ;
+
+STRUCT: sub_framework_command
+    { cmd         uint32_t }
+    { cmdsize     uint32_t }
+    { umbrella    lc_str   } ;
+
+STRUCT: sub_client_command
+    { cmd        uint32_t }
+    { cmdsize    uint32_t }
+    { client     lc_str   } ;
+
+STRUCT: sub_umbrella_command
+    { cmd             uint32_t }
+    { cmdsize         uint32_t }
+    { sub_umbrella    lc_str   } ;
+
+STRUCT: sub_library_command
+    { cmd            uint32_t }
+    { cmdsize        uint32_t }
+    { sub_library    lc_str   } ;
+
+STRUCT: prebound_dylib_command
+    { cmd               uint32_t }
+    { cmdsize           uint32_t }
+    { name              lc_str   }
+    { nmodules          uint32_t }
+    { linked_modules    lc_str   } ;
+
+STRUCT: dylinker_command
+    { cmd        uint32_t }
+    { cmdsize    uint32_t }
+    { name       lc_str   } ;
+
+STRUCT: thread_command
+    { cmd        uint32_t }
+    { cmdsize    uint32_t } ;
+
+STRUCT: routines_command
+    { cmd             uint32_t }
+    { cmdsize         uint32_t }
+    { init_address    uint32_t }
+    { init_module     uint32_t }
+    { reserved1       uint32_t }
+    { reserved2       uint32_t }
+    { reserved3       uint32_t }
+    { reserved4       uint32_t }
+    { reserved5       uint32_t }
+    { reserved6       uint32_t } ;
+
+STRUCT: routines_command_64
+    { cmd             uint32_t }
+    { cmdsize         uint32_t }
+    { init_address    uint64_t }
+    { init_module     uint64_t }
+    { reserved1       uint64_t }
+    { reserved2       uint64_t }
+    { reserved3       uint64_t }
+    { reserved4       uint64_t }
+    { reserved5       uint64_t }
+    { reserved6       uint64_t } ;
+
+STRUCT: symtab_command
+    { cmd        uint32_t }
+    { cmdsize    uint32_t }
+    { symoff     uint32_t }
+    { nsyms      uint32_t }
+    { stroff     uint32_t }
+    { strsize    uint32_t } ;
+
+STRUCT: dysymtab_command
+    { cmd            uint32_t }
+    { cmdsize        uint32_t }
+    { ilocalsym      uint32_t }
+    { nlocalsym      uint32_t }
+    { iextdefsym     uint32_t }
+    { nextdefsym     uint32_t }
+    { iundefsym      uint32_t }
+    { nundefsym      uint32_t }
+    { tocoff         uint32_t }
+    { ntoc           uint32_t }
+    { modtaboff      uint32_t }
+    { nmodtab        uint32_t }
+    { extrefsymoff   uint32_t }
+    { nextrefsyms    uint32_t }
+    { indirectsymoff uint32_t }
+    { nindirectsyms  uint32_t }
+    { extreloff      uint32_t }
+    { nextrel        uint32_t }
+    { locreloff      uint32_t }
+    { nlocrel        uint32_t } ;
+
+CONSTANT: INDIRECT_SYMBOL_LOCAL HEX: 80000000
+CONSTANT: INDIRECT_SYMBOL_ABS   HEX: 40000000
+
+STRUCT: dylib_table_of_contents
+    { symbol_index uint32_t }
+    { module_index uint32_t } ;
+
+STRUCT: dylib_module
+    { module_name           uint32_t }
+    { iextdefsym            uint32_t }
+    { nextdefsym            uint32_t }
+    { irefsym               uint32_t }
+    { nrefsym               uint32_t }
+    { ilocalsym             uint32_t }
+    { nlocalsym             uint32_t }
+    { iextrel               uint32_t }
+    { nextrel               uint32_t }
+    { iinit_iterm           uint32_t }
+    { ninit_nterm           uint32_t }
+    { objc_module_info_addr uint32_t }
+    { objc_module_info_size uint32_t } ;
+
+STRUCT: dylib_module_64
+    { module_name           uint32_t }
+    { iextdefsym            uint32_t }
+    { nextdefsym            uint32_t }
+    { irefsym               uint32_t }
+    { nrefsym               uint32_t }
+    { ilocalsym             uint32_t }
+    { nlocalsym             uint32_t }
+    { iextrel               uint32_t }
+    { nextrel               uint32_t }
+    { iinit_iterm           uint32_t }
+    { ninit_nterm           uint32_t }
+    { objc_module_info_size uint32_t }
+    { objc_module_info_addr uint64_t } ;
+
+STRUCT: dylib_reference
+    { isym_flags uint32_t } ;
+
+STRUCT: twolevel_hints_command
+    { cmd     uint32_t }
+    { cmdsize uint32_t }
+    { offset  uint32_t }
+    { nhints  uint32_t } ;
+
+STRUCT: twolevel_hint
+    { isub_image_itoc uint32_t } ;
+
+STRUCT: prebind_cksum_command
+    { cmd     uint32_t }
+    { cmdsize uint32_t }
+    { cksum   uint32_t } ;
+
+STRUCT: uuid_command
+    { cmd        uint32_t    }
+    { cmdsize    uint32_t    }
+    { uuid       uint8_t[16] } ;
+
+STRUCT: rpath_command
+    { cmd         uint32_t }
+    { cmdsize     uint32_t }
+    { path        lc_str   } ;
+
+STRUCT: linkedit_data_command
+    { cmd         uint32_t }
+    { cmdsize     uint32_t }
+    { dataoff     uint32_t }
+    { datasize    uint32_t } ;
+
+STRUCT: encryption_info_command
+    { cmd       uint32_t }
+    { cmdsize   uint32_t }
+    { cryptoff  uint32_t }
+    { cryptsize uint32_t }
+    { cryptid   uint32_t } ;
+
+STRUCT: dyld_info_command
+    { cmd              uint32_t }
+    { cmdsize          uint32_t }
+    { rebase_off       uint32_t }
+    { rebase_size      uint32_t }
+    { bind_off         uint32_t }
+    { bind_size        uint32_t }
+    { weak_bind_off    uint32_t }
+    { weak_bind_size   uint32_t }
+    { lazy_bind_off    uint32_t }
+    { lazy_bind_size   uint32_t }
+    { export_off       uint32_t }
+    { export_size      uint32_t } ;
+
+CONSTANT: REBASE_TYPE_POINTER                     1
+CONSTANT: REBASE_TYPE_TEXT_ABSOLUTE32             2
+CONSTANT: REBASE_TYPE_TEXT_PCREL32                3
+
+CONSTANT: REBASE_OPCODE_MASK                                  HEX: F0
+CONSTANT: REBASE_IMMEDIATE_MASK                               HEX: 0F
+CONSTANT: REBASE_OPCODE_DONE                                  HEX: 00
+CONSTANT: REBASE_OPCODE_SET_TYPE_IMM                          HEX: 10
+CONSTANT: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB           HEX: 20
+CONSTANT: REBASE_OPCODE_ADD_ADDR_ULEB                         HEX: 30
+CONSTANT: REBASE_OPCODE_ADD_ADDR_IMM_SCALED                   HEX: 40
+CONSTANT: REBASE_OPCODE_DO_REBASE_IMM_TIMES                   HEX: 50
+CONSTANT: REBASE_OPCODE_DO_REBASE_ULEB_TIMES                  HEX: 60
+CONSTANT: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB               HEX: 70
+CONSTANT: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB    HEX: 80
+
+CONSTANT: BIND_TYPE_POINTER                       1
+CONSTANT: BIND_TYPE_TEXT_ABSOLUTE32               2
+CONSTANT: BIND_TYPE_TEXT_PCREL32                  3
+
+CONSTANT: BIND_SPECIAL_DYLIB_SELF                     0
+CONSTANT: BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE          -1
+CONSTANT: BIND_SPECIAL_DYLIB_FLAT_LOOKUP              -2
+
+CONSTANT: BIND_SYMBOL_FLAGS_WEAK_IMPORT                   HEX: 1
+CONSTANT: BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION           HEX: 8
+
+CONSTANT: BIND_OPCODE_MASK                                    HEX: F0
+CONSTANT: BIND_IMMEDIATE_MASK                                 HEX: 0F
+CONSTANT: BIND_OPCODE_DONE                                    HEX: 00
+CONSTANT: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM                   HEX: 10
+CONSTANT: BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB                  HEX: 20
+CONSTANT: BIND_OPCODE_SET_DYLIB_SPECIAL_IMM                   HEX: 30
+CONSTANT: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM           HEX: 40
+CONSTANT: BIND_OPCODE_SET_TYPE_IMM                            HEX: 50
+CONSTANT: BIND_OPCODE_SET_ADDEND_SLEB                         HEX: 60
+CONSTANT: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB             HEX: 70
+CONSTANT: BIND_OPCODE_ADD_ADDR_ULEB                           HEX: 80
+CONSTANT: BIND_OPCODE_DO_BIND                                 HEX: 90
+CONSTANT: BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB                   HEX: A0
+CONSTANT: BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED             HEX: B0
+CONSTANT: BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB        HEX: C0
+
+CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_MASK                   HEX: 03
+CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_REGULAR                HEX: 00
+CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL           HEX: 01
+CONSTANT: EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION             HEX: 04
+CONSTANT: EXPORT_SYMBOL_FLAGS_INDIRECT_DEFINITION         HEX: 08
+CONSTANT: EXPORT_SYMBOL_FLAGS_HAS_SPECIALIZATIONS         HEX: 10
+
+STRUCT: symseg_command
+    { cmd        uint32_t }
+    { cmdsize    uint32_t }
+    { offset     uint32_t }
+    { size       uint32_t } ;
+
+STRUCT: ident_command
+    { cmd     uint32_t }
+    { cmdsize uint32_t } ;
+
+STRUCT: fvmfile_command
+    { cmd            uint32_t }
+    { cmdsize        uint32_t }
+    { name           lc_str   }
+    { header_addr    uint32_t } ;
+
+! machine.h
+CONSTANT: CPU_STATE_MAX       4
+CONSTANT: CPU_STATE_USER      0
+CONSTANT: CPU_STATE_SYSTEM    1
+CONSTANT: CPU_STATE_IDLE      2
+CONSTANT: CPU_STATE_NICE      3
+
+CONSTANT: CPU_ARCH_MASK   HEX: ff000000
+CONSTANT: CPU_ARCH_ABI64  HEX: 01000000
+
+CONSTANT: CPU_TYPE_ANY            -1
+CONSTANT: CPU_TYPE_VAX            1
+CONSTANT: CPU_TYPE_MC680x0        6
+CONSTANT: CPU_TYPE_X86            7
+CONSTANT: CPU_TYPE_I386           $ CPU_TYPE_X86
+CONSTANT: CPU_TYPE_X86_64         $[ CPU_TYPE_X86 CPU_ARCH_ABI64 bitor ]
+CONSTANT: CPU_TYPE_MC98000        10
+CONSTANT: CPU_TYPE_HPPA           11
+CONSTANT: CPU_TYPE_ARM            12
+CONSTANT: CPU_TYPE_MC88000        13
+CONSTANT: CPU_TYPE_SPARC          14
+CONSTANT: CPU_TYPE_I860           15
+CONSTANT: CPU_TYPE_POWERPC        18
+CONSTANT: CPU_TYPE_POWERPC64      $[ $ CPU_TYPE_POWERPC CPU_ARCH_ABI64 bitor ]
+
+CONSTANT: CPU_SUBTYPE_MASK    HEX: ff000000
+CONSTANT: CPU_SUBTYPE_LIB64   HEX: 80000000
+
+CONSTANT: CPU_SUBTYPE_MULTIPLE        -1
+CONSTANT: CPU_SUBTYPE_LITTLE_ENDIAN   0
+CONSTANT: CPU_SUBTYPE_BIG_ENDIAN      1
+
+CONSTANT: CPU_THREADTYPE_NONE     0
+
+CONSTANT: CPU_SUBTYPE_VAX_ALL 0
+CONSTANT: CPU_SUBTYPE_VAX780  1
+CONSTANT: CPU_SUBTYPE_VAX785  2
+CONSTANT: CPU_SUBTYPE_VAX750  3
+CONSTANT: CPU_SUBTYPE_VAX730  4
+CONSTANT: CPU_SUBTYPE_UVAXI   5
+CONSTANT: CPU_SUBTYPE_UVAXII  6
+CONSTANT: CPU_SUBTYPE_VAX8200 7
+CONSTANT: CPU_SUBTYPE_VAX8500 8
+CONSTANT: CPU_SUBTYPE_VAX8600 9
+CONSTANT: CPU_SUBTYPE_VAX8650 10
+CONSTANT: CPU_SUBTYPE_VAX8800 11
+CONSTANT: CPU_SUBTYPE_UVAXIII 12
+
+CONSTANT: CPU_SUBTYPE_MC680x0_ALL     1
+CONSTANT: CPU_SUBTYPE_MC68030     1
+CONSTANT: CPU_SUBTYPE_MC68040     2
+CONSTANT: CPU_SUBTYPE_MC68030_ONLY    3
+
+: CPU_SUBTYPE_INTEL ( f m -- subtype ) 4 shift + ; inline
+
+CONSTANT: CPU_SUBTYPE_I386_ALL              3
+CONSTANT: CPU_SUBTYPE_386                   3
+CONSTANT: CPU_SUBTYPE_486                   4
+CONSTANT: CPU_SUBTYPE_486SX                 132
+CONSTANT: CPU_SUBTYPE_586                   5
+CONSTANT: CPU_SUBTYPE_PENT                  5
+CONSTANT: CPU_SUBTYPE_PENTPRO               22
+CONSTANT: CPU_SUBTYPE_PENTII_M3             54
+CONSTANT: CPU_SUBTYPE_PENTII_M5             86
+CONSTANT: CPU_SUBTYPE_CELERON               103
+CONSTANT: CPU_SUBTYPE_CELERON_MOBILE        119
+CONSTANT: CPU_SUBTYPE_PENTIUM_3             8
+CONSTANT: CPU_SUBTYPE_PENTIUM_3_M           24
+CONSTANT: CPU_SUBTYPE_PENTIUM_3_XEON        40
+CONSTANT: CPU_SUBTYPE_PENTIUM_M             9
+CONSTANT: CPU_SUBTYPE_PENTIUM_4             10
+CONSTANT: CPU_SUBTYPE_PENTIUM_4_M           26
+CONSTANT: CPU_SUBTYPE_ITANIUM               11
+CONSTANT: CPU_SUBTYPE_ITANIUM_2             27
+CONSTANT: CPU_SUBTYPE_XEON                  12
+CONSTANT: CPU_SUBTYPE_XEON_MP               28
+
+: CPU_SUBTYPE_INTEL_FAMILY ( x -- family ) 15 bitand ; inline
+
+CONSTANT: CPU_SUBTYPE_INTEL_FAMILY_MAX    15
+
+: CPU_SUBTYPE_INTEL_MODEL ( x -- model ) -4 shift ; inline
+
+CONSTANT: CPU_SUBTYPE_INTEL_MODEL_ALL 0
+CONSTANT: CPU_SUBTYPE_X86_ALL         3
+CONSTANT: CPU_SUBTYPE_X86_64_ALL      3
+CONSTANT: CPU_SUBTYPE_X86_ARCH1       4
+CONSTANT: CPU_THREADTYPE_INTEL_HTT    1
+
+CONSTANT: CPU_SUBTYPE_MIPS_ALL    0
+CONSTANT: CPU_SUBTYPE_MIPS_R2300  1
+CONSTANT: CPU_SUBTYPE_MIPS_R2600  2
+CONSTANT: CPU_SUBTYPE_MIPS_R2800  3
+CONSTANT: CPU_SUBTYPE_MIPS_R2000a 4
+CONSTANT: CPU_SUBTYPE_MIPS_R2000  5
+CONSTANT: CPU_SUBTYPE_MIPS_R3000a 6
+CONSTANT: CPU_SUBTYPE_MIPS_R3000  7
+
+CONSTANT: CPU_SUBTYPE_MC98000_ALL 0
+CONSTANT: CPU_SUBTYPE_MC98601     1
+
+CONSTANT: CPU_SUBTYPE_HPPA_ALL        0
+CONSTANT: CPU_SUBTYPE_HPPA_7100       0
+CONSTANT: CPU_SUBTYPE_HPPA_7100LC     1
+
+CONSTANT: CPU_SUBTYPE_MC88000_ALL 0
+CONSTANT: CPU_SUBTYPE_MC88100     1
+CONSTANT: CPU_SUBTYPE_MC88110     2
+
+CONSTANT: CPU_SUBTYPE_SPARC_ALL       0
+
+CONSTANT: CPU_SUBTYPE_I860_ALL    0
+CONSTANT: CPU_SUBTYPE_I860_860    1
+
+CONSTANT: CPU_SUBTYPE_POWERPC_ALL     0
+CONSTANT: CPU_SUBTYPE_POWERPC_601     1
+CONSTANT: CPU_SUBTYPE_POWERPC_602     2
+CONSTANT: CPU_SUBTYPE_POWERPC_603     3
+CONSTANT: CPU_SUBTYPE_POWERPC_603e    4
+CONSTANT: CPU_SUBTYPE_POWERPC_603ev   5
+CONSTANT: CPU_SUBTYPE_POWERPC_604     6
+CONSTANT: CPU_SUBTYPE_POWERPC_604e    7
+CONSTANT: CPU_SUBTYPE_POWERPC_620     8
+CONSTANT: CPU_SUBTYPE_POWERPC_750     9
+CONSTANT: CPU_SUBTYPE_POWERPC_7400    10
+CONSTANT: CPU_SUBTYPE_POWERPC_7450    11
+CONSTANT: CPU_SUBTYPE_POWERPC_970     100
+
+CONSTANT: CPU_SUBTYPE_ARM_ALL             0
+CONSTANT: CPU_SUBTYPE_ARM_V4T             5
+CONSTANT: CPU_SUBTYPE_ARM_V6              6
+CONSTANT: CPU_SUBTYPE_ARM_V5TEJ           7
+CONSTANT: CPU_SUBTYPE_ARM_XSCALE          8
+CONSTANT: CPU_SUBTYPE_ARM_V7              9
+
+CONSTANT: CPUFAMILY_UNKNOWN    0
+CONSTANT: CPUFAMILY_POWERPC_G3 HEX: cee41549
+CONSTANT: CPUFAMILY_POWERPC_G4 HEX: 77c184ae
+CONSTANT: CPUFAMILY_POWERPC_G5 HEX: ed76d8aa
+CONSTANT: CPUFAMILY_INTEL_6_13 HEX: aa33392b
+CONSTANT: CPUFAMILY_INTEL_6_14 HEX: 73d67300
+CONSTANT: CPUFAMILY_INTEL_6_15 HEX: 426f69ef
+CONSTANT: CPUFAMILY_INTEL_6_23 HEX: 78ea4fbc
+CONSTANT: CPUFAMILY_INTEL_6_26 HEX: 6b5a4cd2
+CONSTANT: CPUFAMILY_ARM_9      HEX: e73283ae
+CONSTANT: CPUFAMILY_ARM_11     HEX: 8ff620d8
+CONSTANT: CPUFAMILY_ARM_XSCALE HEX: 53b005f5
+CONSTANT: CPUFAMILY_ARM_13     HEX: 0cc90e64
+
+CONSTANT: CPUFAMILY_INTEL_YONAH   $ CPUFAMILY_INTEL_6_14
+CONSTANT: CPUFAMILY_INTEL_MEROM   $ CPUFAMILY_INTEL_6_15
+CONSTANT: CPUFAMILY_INTEL_PENRYN  $ CPUFAMILY_INTEL_6_23
+CONSTANT: CPUFAMILY_INTEL_NEHALEM $ CPUFAMILY_INTEL_6_26
+
+CONSTANT: CPUFAMILY_INTEL_CORE    $ CPUFAMILY_INTEL_6_14
+CONSTANT: CPUFAMILY_INTEL_CORE2   $ CPUFAMILY_INTEL_6_15
+
+! fat.h
+CONSTANT: FAT_MAGIC HEX: cafebabe
+CONSTANT: FAT_CIGAM HEX: bebafeca
+
+STRUCT: fat_header
+    { magic        uint32_t }
+    { nfat_arch    uint32_t } ;
+
+STRUCT: fat_arch
+    { cputype      cpu_type_t    }
+    { cpusubtype   cpu_subtype_t }
+    { offset       uint32_t      }
+    { size         uint32_t      }
+    { align        uint32_t      } ;
+
+! nlist.h
+STRUCT: nlist
+    { n_strx  int32_t  }
+    { n_type  uint8_t  }
+    { n_sect  uint8_t  }
+    { n_desc  int16_t  }
+    { n_value uint32_t } ;
+
+STRUCT: nlist_64
+    { n_strx  uint32_t }
+    { n_type  uint8_t  }
+    { n_sect  uint8_t  }
+    { n_desc  uint16_t }
+    { n_value uint64_t } ;
+
+CONSTANT: N_STAB  HEX: e0
+CONSTANT: N_PEXT  HEX: 10
+CONSTANT: N_TYPE  HEX: 0e
+CONSTANT: N_EXT   HEX: 01
+
+CONSTANT: N_UNDF  HEX: 0
+CONSTANT: N_ABS   HEX: 2
+CONSTANT: N_SECT  HEX: e
+CONSTANT: N_PBUD  HEX: c
+CONSTANT: N_INDR  HEX: a
+
+CONSTANT: NO_SECT     0
+CONSTANT: MAX_SECT    255
+
+: GET_COMM_ALIGN ( n_desc -- align )
+    -8 shift HEX: 0f bitand ; inline
+
+: SET_COMM_ALIGN ( n_desc align -- n_desc )
+    [ HEX: f0ff bitand ]
+    [ HEX: 000f bitand 8 shift ] bi* bitor ; inline
+
+CONSTANT: REFERENCE_TYPE                              7
+CONSTANT: REFERENCE_FLAG_UNDEFINED_NON_LAZY           0
+CONSTANT: REFERENCE_FLAG_UNDEFINED_LAZY               1
+CONSTANT: REFERENCE_FLAG_DEFINED                      2
+CONSTANT: REFERENCE_FLAG_PRIVATE_DEFINED              3
+CONSTANT: REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY   4
+CONSTANT: REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY       5
+
+CONSTANT: REFERENCED_DYNAMICALLY  HEX: 0010
+
+: GET_LIBRARY_ORDINAL ( n_desc -- ordinal )
+    -8 shift HEX: ff bitand ; inline
+
+: SET_LIBRARY_ORDINAL ( n_desc ordinal -- n_desc )
+    [ HEX: 00ff bitand ]
+    [ HEX: 00ff bitand 8 shift ] bi* bitor ; inline
+
+CONSTANT: SELF_LIBRARY_ORDINAL   HEX: 0
+CONSTANT: MAX_LIBRARY_ORDINAL    HEX: fd
+CONSTANT: DYNAMIC_LOOKUP_ORDINAL HEX: fe
+CONSTANT: EXECUTABLE_ORDINAL     HEX: ff
+
+CONSTANT: N_NO_DEAD_STRIP  HEX: 0020
+CONSTANT: N_DESC_DISCARDED HEX: 0020
+CONSTANT: N_WEAK_REF       HEX: 0040
+CONSTANT: N_WEAK_DEF       HEX: 0080
+CONSTANT: N_REF_TO_WEAK    HEX: 0080
+CONSTANT: N_ARM_THUMB_DEF  HEX: 0008
+
+! ranlib.h
+CONSTANT: SYMDEF        "__.SYMDEF"
+CONSTANT: SYMDEF_SORTED "__.SYMDEF SORTED"
+
+STRUCT: ranlib
+    { ran_strx uint32_t }
+    { ran_off  uint32_t } ;
+
+! reloc.h
+STRUCT: relocation_info
+    { r_address                            int32_t  }
+    { r_symbolnum_pcrel_length_extern_type uint32_t } ;
+
+CONSTANT: R_ABS   0
+CONSTANT: R_SCATTERED HEX: 80000000
+
+STRUCT: scattered_relocation_info_big_endian
+    { r_scattered_pcrel_length_type_address  uint32_t }
+    { r_value                                int32_t  } ;
+
+STRUCT: scattered_relocation_info_little_endian
+    { r_address_type_length_pcrel_scattered uint32_t }
+    { r_value                               int32_t  } ;
+
+TYPEDEF: int reloc_type_generic
+C-ENUM:
+    GENERIC_RELOC_VANILLA
+    GENERIC_RELOC_PAIR
+    GENERIC_RELOC_SECTDIFF
+    GENERIC_RELOC_PB_LA_PTR
+    GENERIC_RELOC_LOCAL_SECTDIFF ;
+
+TYPEDEF: int reloc_type_x86_64
+C-ENUM:
+    X86_64_RELOC_UNSIGNED
+    X86_64_RELOC_SIGNED
+    X86_64_RELOC_BRANCH
+    X86_64_RELOC_GOT_LOAD
+    X86_64_RELOC_GOT
+    X86_64_RELOC_SUBTRACTOR
+    X86_64_RELOC_SIGNED_1
+    X86_64_RELOC_SIGNED_2
+    X86_64_RELOC_SIGNED_4 ;
+
+TYPEDEF: int reloc_type_ppc
+C-ENUM:
+    PPC_RELOC_VANILLA
+    PPC_RELOC_PAIR
+    PPC_RELOC_BR14
+    PPC_RELOC_BR24
+    PPC_RELOC_HI16
+    PPC_RELOC_LO16
+    PPC_RELOC_HA16
+    PPC_RELOC_LO14
+    PPC_RELOC_SECTDIFF
+    PPC_RELOC_PB_LA_PTR
+    PPC_RELOC_HI16_SECTDIFF
+    PPC_RELOC_LO16_SECTDIFF
+    PPC_RELOC_HA16_SECTDIFF
+    PPC_RELOC_JBSR
+    PPC_RELOC_LO14_SECTDIFF
+    PPC_RELOC_LOCAL_SECTDIFF ;
diff --git a/extra/macho/summary.txt b/extra/macho/summary.txt
new file mode 100644 (file)
index 0000000..aaef275
--- /dev/null
@@ -0,0 +1 @@
+Constants and structs related to the Mach object format.