#------------------------------------------------------------
# $File: mach,v 1.29 2021/04/26 15:56:00 christos Exp $
# Mach has two magic numbers, 0xcafebabe and 0xfeedface.
# Unfortunately the first, cafebabe, is shared with
# Java ByteCode, so they are both handled in the file "cafebabe".
# The "feedface" ones are handled herein.
#------------------------------------------------------------
# if set, it's for the 64-bit version of the architecture
# yes, this is separate from the low-order magic number bit
# it's also separate from the "64-bit libraries" bit in the
# upper 8 bits of the CPU subtype

# Reference:    https://opensource.apple.com/source/cctools/cctools-949.0.1/
#               include/mach-o/loader.h
# display CPU type as string like: i386 x86_64 ... armv7 armv7k ...
0       name    mach-o-cpu
>0      belong&0xff000000       0
#
# 32-bit ABIs.
#
#                               1       vax
>>0     belong&0x00ffffff       1
>>>4            belong&0x00ffffff       0       vax
>>>4            belong&0x00ffffff       1       vax11/780
>>>4            belong&0x00ffffff       2       vax11/785
>>>4            belong&0x00ffffff       3       vax11/750
>>>4            belong&0x00ffffff       4       vax11/730
>>>4            belong&0x00ffffff       5       uvaxI
>>>4            belong&0x00ffffff       6       uvaxII
>>>4            belong&0x00ffffff       7       vax8200
>>>4            belong&0x00ffffff       8       vax8500
>>>4            belong&0x00ffffff       9       vax8600
>>>4            belong&0x00ffffff       10      vax8650
>>>4            belong&0x00ffffff       11      vax8800
>>>4            belong&0x00ffffff       12      uvaxIII
>>>4            belong&0x00ffffff       >12     vax subarchitecture=%d
>>0     belong&0x00ffffff       2       romp
>>0     belong&0x00ffffff       3       architecture=3
>>0     belong&0x00ffffff       4       ns32032
>>0     belong&0x00ffffff       5       ns32332
>>0     belong&0x00ffffff       6       m68k
#                               7       x86
>>0     belong&0x00ffffff       7
>>>4    belong&0x0000000f       3               i386
>>>4    belong&0x0000000f       4               i486
>>>>4   belong&0x00fffff0       0
>>>>4   belong&0x00fffff0       0x80            \bsx
>>>4    belong&0x0000000f       5               i586
>>>4    belong&0x0000000f       6
>>>>4   belong&0x00fffff0       0               p6
>>>>4   belong&0x00fffff0       0x10            pentium_pro
>>>>4   belong&0x00fffff0       0x20            pentium_2_m0x20
>>>>4   belong&0x00fffff0       0x30            pentium_2_m3
>>>>4   belong&0x00fffff0       0x40            pentium_2_m0x40
>>>>4   belong&0x00fffff0       0x50            pentium_2_m5
>>>>4   belong&0x00fffff0       >0x50           pentium_2_m%#x
>>>4    belong&0x0000000f       7               celeron
>>>>4   belong&0x00fffff0       0x00            \b_m%#x
>>>>4   belong&0x00fffff0       0x10            \b_m%#x
>>>>4   belong&0x00fffff0       0x20            \b_m%#x
>>>>4   belong&0x00fffff0       0x30            \b_m%#x
>>>>4   belong&0x00fffff0       0x40            \b_m%#x
>>>>4   belong&0x00fffff0       0x50            \b_m%#x
>>>>4   belong&0x00fffff0       0x60
>>>>4   belong&0x00fffff0       0x70            \b_mobile
>>>>4   belong&0x00fffff0       >0x70           \b_m%#x
>>>4    belong&0x0000000f       8               pentium_3
>>>>4   belong&0x00fffff0       0x00
>>>>4   belong&0x00fffff0       0x10            \b_m
>>>>4   belong&0x00fffff0       0x20            \b_xeon
>>>>4   belong&0x00fffff0       >0x20           \b_m%#x
>>>4    belong&0x0000000f       9               pentiumM
>>>>4   belong&0x00fffff0       0x00
>>>>4   belong&0x00fffff0       >0x00           \b_m%#x
>>>4    belong&0x0000000f       10              pentium_4
>>>>4   belong&0x00fffff0       0x00
>>>>4   belong&0x00fffff0       0x10            \b_m
>>>>4   belong&0x00fffff0       >0x10           \b_m%#x
>>>4    belong&0x0000000f       11              itanium
>>>>4   belong&0x00fffff0       0x00
>>>>4   belong&0x00fffff0       0x10            \b_2
>>>>4   belong&0x00fffff0       >0x10           \b_m%#x
>>>4    belong&0x0000000f       12              xeon
>>>>4   belong&0x00fffff0       0x00
>>>>4   belong&0x00fffff0       0x10            \b_mp
>>>>4   belong&0x00fffff0       >0x10           \b_m%#x
>>>4    belong&0x0000000f       >12             ia32 family=%d
>>>>4   belong&0x00fffff0       0x00
>>>>4   belong&0x00fffff0       >0x00           model=%x
>>0     belong&0x00ffffff       8       mips
>>>4            belong&0x00ffffff       1       R2300
>>>4            belong&0x00ffffff       2       R2600
>>>4            belong&0x00ffffff       3       R2800
>>>4            belong&0x00ffffff       4       R2000a
>>>4            belong&0x00ffffff       5       R2000
>>>4            belong&0x00ffffff       6       R3000a
>>>4            belong&0x00ffffff       7       R3000
>>>4            belong&0x00ffffff       >7      subarchitecture=%d
>>0     belong&0x00ffffff       9       ns32532
>>0     belong&0x00ffffff       10      mc98000
>>0     belong&0x00ffffff       11      hppa
>>>4            belong&0x00ffffff       0       7100
>>>4            belong&0x00ffffff       1       7100LC
>>>4            belong&0x00ffffff       >1      subarchitecture=%d
>>0     belong&0x00ffffff       12      arm
>>>4            belong&0x00ffffff       0
>>>4            belong&0x00ffffff       1       subarchitecture=%d
>>>4            belong&0x00ffffff       2       subarchitecture=%d
>>>4            belong&0x00ffffff       3       subarchitecture=%d
>>>4            belong&0x00ffffff       4       subarchitecture=%d
>>>4            belong&0x00ffffff       5       \bv4t
>>>4            belong&0x00ffffff       6       \bv6
>>>4            belong&0x00ffffff       7       \bv5tej
>>>4            belong&0x00ffffff       8       \bxscale
>>>4            belong&0x00ffffff       9       \bv7
>>>4            belong&0x00ffffff       10      \bv7f
>>>4            belong&0x00ffffff       11      \bv7s
>>>4            belong&0x00ffffff       12      \bv7k
>>>4            belong&0x00ffffff       13      \bv8
>>>4            belong&0x00ffffff       14      \bv6m
>>>4            belong&0x00ffffff       15      \bv7m
>>>4            belong&0x00ffffff       16      \bv7em
>>>4            belong&0x00ffffff       >16     subarchitecture=%d
#                               13      m88k
>>0     belong&0x00ffffff       13
>>>4            belong&0x00ffffff       0       mc88000
>>>4            belong&0x00ffffff       1       mc88100
>>>4            belong&0x00ffffff       2       mc88110
>>>4            belong&0x00ffffff       >2      mc88000 subarchitecture=%d
>>0     belong&0x00ffffff       14      SPARC
>>0     belong&0x00ffffff       15      i860g
>>0     belong&0x00ffffff       16      alpha
>>0     belong&0x00ffffff       17      rs6000
>>0     belong&0x00ffffff       18      ppc
>>>4            belong&0x00ffffff       0
>>>4            belong&0x00ffffff       1       \b_601
>>>4            belong&0x00ffffff       2       \b_602
>>>4            belong&0x00ffffff       3       \b_603
>>>4            belong&0x00ffffff       4       \b_603e
>>>4            belong&0x00ffffff       5       \b_603ev
>>>4            belong&0x00ffffff       6       \b_604
>>>4            belong&0x00ffffff       7       \b_604e
>>>4            belong&0x00ffffff       8       \b_620
>>>4            belong&0x00ffffff       9       \b_750
>>>4            belong&0x00ffffff       10      \b_7400
>>>4            belong&0x00ffffff       11      \b_7450
>>>4            belong&0x00ffffff       100     \b_970
>>>4            belong&0x00ffffff       >100    subarchitecture=%d
>>0     belong&0x00ffffff       >18     architecture=%d
>0      belong&0xff000000       0x01000000
#
# 64-bit ABIs.
#
>>0     belong&0x00ffffff       0       64-bit architecture=%d
>>0     belong&0x00ffffff       1       64-bit architecture=%d
>>0     belong&0x00ffffff       2       64-bit architecture=%d
>>0     belong&0x00ffffff       3       64-bit architecture=%d
>>0     belong&0x00ffffff       4       64-bit architecture=%d
>>0     belong&0x00ffffff       5       64-bit architecture=%d
>>0     belong&0x00ffffff       6       64-bit architecture=%d
>>0     belong&0x00ffffff       7       x86_64
>>>4            belong&0x00ffffff       0       subarchitecture=%d
>>>4            belong&0x00ffffff       1       subarchitecture=%d
>>>4            belong&0x00ffffff       2       subarchitecture=%d
>>>4            belong&0x00ffffff       3
>>>4            belong&0x00ffffff       4       \b_arch1
>>>4            belong&0x00ffffff       8       \b_haswell
>>>4            belong&0x00ffffff       >4      subarchitecture=%d
>>0     belong&0x00ffffff       8       64-bit architecture=%d
>>0     belong&0x00ffffff       9       64-bit architecture=%d
>>0     belong&0x00ffffff       10      64-bit architecture=%d
>>0     belong&0x00ffffff       11      64-bit architecture=%d
>>0     belong&0x00ffffff       12      arm64
>>>4            belong&0x00ffffff       0
>>>4            belong&0x00ffffff       1       \bv8
>>>4            belong&0x00ffffff       2       \be
>>>>7           ubyte&0xff              >0      (caps:
>>>>7           ubyte&0xff              <0x80   %#02x
>>>>7           ubyte&0xc0              0x80    PAC
>>>>>7          ubyte&0x3f              x       \b%02d
>>>>7           ubyte&0xc0              0xc0    PAK
>>>>>7          ubyte&0x3f              x       \b%02d
>>>>7           ubyte&0xff              x       \b)
>>>4            belong&0x00ffffff       >2      subarchitecture=%d
>>0     belong&0x00ffffff       13      64-bit architecture=%d
>>0     belong&0x00ffffff       14      64-bit architecture=%d
>>0     belong&0x00ffffff       15      64-bit architecture=%d
>>0     belong&0x00ffffff       16      64-bit architecture=%d
>>0     belong&0x00ffffff       17      64-bit architecture=%d
>>0     belong&0x00ffffff       18      ppc64
>>>4            belong&0x00ffffff       0
>>>4            belong&0x00ffffff       1               \b_601
>>>4            belong&0x00ffffff       2               \b_602
>>>4            belong&0x00ffffff       3               \b_603
>>>4            belong&0x00ffffff       4               \b_603e
>>>4            belong&0x00ffffff       5               \b_603ev
>>>4            belong&0x00ffffff       6               \b_604
>>>4            belong&0x00ffffff       7               \b_604e
>>>4            belong&0x00ffffff       8               \b_620
>>>4            belong&0x00ffffff       9               \b_650
>>>4            belong&0x00ffffff       10              \b_7400
>>>4            belong&0x00ffffff       11              \b_7450
>>>4            belong&0x00ffffff       100             \b_970
>>>4            belong&0x00ffffff       >100            subarchitecture=%d
>>0     belong&0x00ffffff       >18     64-bit architecture=%d
>0      belong&0xff000000       0x02000000
#
# 64_32-bit ABIs.
#
>>0     belong&0x00ffffff       0       64_32-bit architecture=%d
>>0     belong&0x00ffffff       1       64_32-bit architecture=%d
>>0     belong&0x00ffffff       2       64_32-bit architecture=%d
>>0     belong&0x00ffffff       3       64_32-bit architecture=%d
>>0     belong&0x00ffffff       4       64_32-bit architecture=%d
>>0     belong&0x00ffffff       5       64_32-bit architecture=%d
>>0     belong&0x00ffffff       6       64_32-bit architecture=%d
>>0     belong&0x00ffffff       7       64_32-bit architecture=%d
>>0     belong&0x00ffffff       8       64_32-bit architecture=%d
>>0     belong&0x00ffffff       9       64_32-bit architecture=%d
>>0     belong&0x00ffffff       10      64_32-bit architecture=%d
>>0     belong&0x00ffffff       11      64_32-bit architecture=%d
>>0     belong&0x00ffffff       12      64_32-bit arm
>>>4            belong&0x00ffffff       0
>>>4            belong&0x00ffffff       1       \bv8
>>>4            belong&0x00ffffff       >1      subarchitecture=%d
>>0     belong&0x00ffffff       13      64_32-bit architecture=%d
>>0     belong&0x00ffffff       14      64_32-bit architecture=%d
>>0     belong&0x00ffffff       15      64_32-bit architecture=%d
>>0     belong&0x00ffffff       16      64_32-bit architecture=%d
>>0     belong&0x00ffffff       17      64_32-bit architecture=%d
>>0     belong&0x00ffffff       18      64_32-bit architecture=%d
>>0     belong&0x00ffffff       >18     64_32-bit architecture=%d

0       name            mach-o-be
>0      byte            0xcf            64-bit
>4      use             mach-o-cpu
>12     belong          1               object
# GRR: Does not work for Mach-O with 2 architectures; instead display oo
#!:ext  o
!:ext   o/
>12     belong          2               executable
# the executables normally have no file extension like perl,
# but exceptions like perl5.18 perl5.16
!:ext   16/18/
>12     belong          3               fixed virtual memory shared library
>12     belong          4               core
>12     belong          5               preload executable
>12     belong          6               dynamically linked shared library
# GRR: Does not work for Mach-O with 2 architectures; instead display dylibdylib
#!:ext  dylib
!:ext   dylib/
>12     belong          7               dynamic linker
>12     belong          8               bundle
# normally name extension bundle; but exceptions like: AMDil_r700.dylib
!:ext   bundle/dylib/
>12     belong          9               dynamically linked shared library stub
>12     belong          10              dSYM companion file
>12     belong          11              kext bundle
>12     belong          >11
>>12    belong          x               filetype=%d
>24     belong          >0              \b, flags:<
>>24    belong          &0x00000001     \bNOUNDEFS
>>24    belong          &0x00000002     \b|INCRLINK
>>24    belong          &0x00000004     \b|DYLDLINK
>>24    belong          &0x00000008     \b|BINDATLOAD
>>24    belong          &0x00000010     \b|PREBOUND
>>24    belong          &0x00000020     \b|SPLIT_SEGS
>>24    belong          &0x00000040     \b|LAZY_INIT
>>24    belong          &0x00000080     \b|TWOLEVEL
>>24    belong          &0x00000100     \b|FORCE_FLAT
>>24    belong          &0x00000200     \b|NOMULTIDEFS
>>24    belong          &0x00000400     \b|NOFIXPREBINDING
>>24    belong          &0x00000800     \b|PREBINDABLE
>>24    belong          &0x00001000     \b|ALLMODSBOUND
>>24    belong          &0x00002000     \b|SUBSECTIONS_VIA_SYMBOLS
>>24    belong          &0x00004000     \b|CANONICAL
>>24    belong          &0x00008000     \b|WEAK_DEFINES
>>24    belong          &0x00010000     \b|BINDS_TO_WEAK
>>24    belong          &0x00020000     \b|ALLOW_STACK_EXECUTION
>>24    belong          &0x00040000     \b|ROOT_SAFE
>>24    belong          &0x00080000     \b|SETUID_SAFE
>>24    belong          &0x00100000     \b|NO_REEXPORTED_DYLIBS
>>24    belong          &0x00200000     \b|PIE
>>24    belong          &0x00400000     \b|DEAD_STRIPPABLE_DYLIB
>>24    belong          &0x00800000     \b|HAS_TLV_DESCRIPTORS
>>24    belong          &0x01000000     \b|NO_HEAP_EXECUTION
>>24    belong          &0x02000000     \b|APP_EXTENSION_SAFE
>>24    belong          &0x04000000     \b|NLIST_OUTOFSYNC_WITH_DYLDINFO
>>24    belong          &0x08000000     \b|SIM_SUPPORT
>>24    belong          &0x80000000     \b|DYLIB_IN_CACHE
>>24    belong          x               \b>

#
0       lelong&0xfffffffe       0xfeedface      Mach-O
!:strength +1
!:mime application/x-mach-binary
>0      use     \^mach-o-be

0       belong&0xfffffffe       0xfeedface      Mach-O
!:strength +1
!:mime application/x-mach-binary
>0      use     mach-o-be