Logo Search packages:      
Sourcecode: radare2 version File versions  Download package

mach0_specs.h

/* radare - LGPL - Copyright 2010 nibble at develsec.org */

#undef MACH0_
#undef MH_MAGIC
#undef MH_CIGAM

#if R_BIN_MACH064
#define MACH0_(name) name##_64
#define MH_MAGIC 0xfeedfacf
#define MH_CIGAM 0xcffaedfe
#else
#define MACH0_(name) name
#define     MH_MAGIC 0xfeedface
#define MH_CIGAM 0xcefaedfe
#endif
#define FAT_MAGIC 0xcafebabe
#define FAT_CIGAM 0xbebafeca

#ifndef _INCLUDE_MACHO_SPECS_H_
#define _INCLUDE_MACHO_SPECS_H_

#define R_BIN_MACH0_IMPORT_TYPE_OBJECT 0
#define R_BIN_MACH0_IMPORT_TYPE_FUNC 1
#define R_BIN_MACH0_SYMBOL_TYPE_EXT 0
#define R_BIN_MACH0_SYMBOL_TYPE_LOCAL 1

#if __WINDOWS__
typedef int int32_t;
typedef short int16_t;
#endif

typedef int cpu_type_t;
typedef int cpu_subtype_t;
typedef int vm_prot_t;

/*
 * This file describes the format of mach object files.
#include <stdint.h>
 */

/*
 * <mach/machine.h> is needed here for the cpu_type_t and cpu_subtype_t types
 * and contains the constants for the possible values of these types.
#include <mach/machine.h>
 */

/*
 * <mach/vm_prot.h> is needed here for the vm_prot_t type and contains the 
 * constants that are or'ed together for the possible values of this type.
#include <mach/vm_prot.h>
 */

/*
 * <machine/thread_status.h> is expected to define the flavors of the thread
 * states and the structures of those flavors for each machine.
#include <mach/machine/thread_status.h>
#include <architecture/byte_order.h>
 */

/*
 * The 32-bit mach header appears at the very beginning of the object file for
 * 32-bit architectures.
 */
00064 struct mach_header {
      ut32  magic;            /* mach magic number identifier */
      cpu_type_t  cputype;    /* cpu specifier */
      cpu_subtype_t     cpusubtype; /* machine specifier */
      ut32  filetype;   /* type of file */
      ut32  ncmds;            /* number of load commands */
      ut32  sizeofcmds; /* the size of all the load commands */
      ut32  flags;            /* flags */
};

/*
 * The 64-bit mach header appears at the very beginning of object files for
 * 64-bit architectures.
 */
00078 struct mach_header_64 {
      ut32  magic;            /* mach magic number identifier */
      cpu_type_t  cputype;    /* cpu specifier */
      cpu_subtype_t     cpusubtype; /* machine specifier */
      ut32  filetype;   /* type of file */
      ut32  ncmds;            /* number of load commands */
      ut32  sizeofcmds; /* the size of all the load commands */
      ut32  flags;            /* flags */
      ut32  reserved;   /* reserved */
};

/*
 * The layout of the file depends on the filetype.  For all but the MH_OBJECT
 * file type the segments are padded out and aligned on a segment alignment
 * boundary for efficient demand pageing.  The MH_EXECUTE, MH_FVMLIB, MH_DYLIB,
 * MH_DYLINKER and MH_BUNDLE file types also have the headers included as part
 * of their first segment.
 * 
 * The file type MH_OBJECT is a compact format intended as output of the
 * assembler and input (and possibly output) of the link editor (the .o
 * format).  All sections are in one unnamed segment with no segment padding. 
 * This format is used as an executable format when the file is so small the
 * segment padding greatly increases its size.
 *
 * The file type MH_PRELOAD is an executable format intended for things that
 * are not executed under the kernel (proms, stand alones, kernels, etc).  The
 * format can be executed under the kernel but may demand paged it and not
 * preload it before execution.
 *
 * A core file is in MH_CORE format and can be any in an arbritray legal
 * Mach-O file.
 *
 * Constants for the filetype field of the mach_header
 */
#define     MH_OBJECT   0x1         /* relocatable object file */
#define     MH_EXECUTE  0x2         /* demand paged executable file */
#define     MH_FVMLIB   0x3         /* fixed VM shared library file */
#define     MH_CORE           0x4         /* core file */
#define     MH_PRELOAD  0x5         /* preloaded executable file */
#define     MH_DYLIB    0x6         /* dynamically bound shared library */
#define     MH_DYLINKER 0x7         /* dynamic link editor */
#define     MH_BUNDLE   0x8         /* dynamically bound bundle file */
#define     MH_DYLIB_STUB     0x9         /* shared library stub for static */
                              /*  linking only, no section contents */
#define     MH_DSYM           0xa         /* companion file with only debug */
                              /*  sections */

/* Constants for the flags field of the mach_header */
#define     MH_NOUNDEFS 0x1         /* the object file has no undefined
                                 references */
#define     MH_INCRLINK 0x2         /* the object file is the output of an
                                 incremental link against a base file
                                 and can't be link edited again */
#define MH_DYLDLINK     0x4         /* the object file is input for the
                                 dynamic linker and can't be staticly
                                 link edited again */
#define MH_BINDATLOAD   0x8         /* the object file's undefined
                                 references are bound by the dynamic
                                 linker when loaded. */
#define MH_PREBOUND     0x10        /* the file has its dynamic undefined
                                 references prebound. */
#define MH_SPLIT_SEGS   0x20        /* the file has its read-only and
                                 read-write segments split */
#define MH_LAZY_INIT    0x40        /* the shared library init routine is
                                 to be run lazily via catching memory
                                 faults to its writeable segments
                                 (obsolete) */
#define MH_TWOLEVEL     0x80        /* the image is using two-level name
                                 space bindings */
#define MH_FORCE_FLAT   0x100       /* the executable is forcing all images
                                 to use flat name space bindings */
#define MH_NOMULTIDEFS  0x200       /* this umbrella guarantees no multiple
                                 defintions of symbols in its
                                 sub-images so the two-level namespace
                                 hints can always be used. */
#define MH_NOFIXPREBINDING 0x400    /* do not have dyld notify the
                                 prebinding agent about this
                                 executable */
#define MH_PREBINDABLE  0x800           /* the binary is not prebound but can
                                 have its prebinding redone. only used
                                           when MH_PREBOUND is not set. */
#define MH_ALLMODSBOUND 0x1000            /* indicates that this binary binds to
                                           all two-level namespace modules of
                                 its dependent libraries. only used
                                 when MH_PREBINDABLE and MH_TWOLEVEL
                                 are both set. */ 
#define MH_SUBSECTIONS_VIA_SYMBOLS 0x2000/* safe to divide up the sections into
                                  sub-sections via symbols for dead
                                  code stripping */
#define MH_CANONICAL    0x4000            /* the binary has been canonicalized
                                 via the unprebind operation */
#define MH_WEAK_DEFINES 0x8000            /* the final linked image contains
                                 external weak symbols */
#define MH_BINDS_TO_WEAK 0x10000    /* the final linked image uses
                                 weak symbols */

#define MH_ALLOW_STACK_EXECUTION 0x20000/* When this bit is set, all stacks 
                                 in the task will be given stack
                                 execution privilege.  Only used in
                                 MH_EXECUTE filetypes. */

/*
 * Capability bits used in the definition of cpu_type.
 */
#define     CPU_ARCH_MASK     0xff000000        /* mask for architecture bits */
#define CPU_ARCH_ABI64  0x01000000        /* 64 bit ABI */

/*
 * Machine types known by all.
 */

#define CPU_TYPE_ANY          ((cpu_type_t) -1)
#define CPU_TYPE_VAX          ((cpu_type_t) 1)
#define     CPU_TYPE_MC680x0  ((cpu_type_t) 6)
#define CPU_TYPE_X86          ((cpu_type_t) 7)
#define CPU_TYPE_MIPS         ((cpu_type_t) 8)
#define CPU_TYPE_I386         CPU_TYPE_X86            /* compatibility */
#define     CPU_TYPE_X86_64         (CPU_TYPE_X86 | CPU_ARCH_ABI64)
#define CPU_TYPE_MC98000      ((cpu_type_t) 10)
#define CPU_TYPE_HPPA       ((cpu_type_t) 11)
#define CPU_TYPE_ARM        ((cpu_type_t) 12)
#define CPU_TYPE_MC88000      ((cpu_type_t) 13)
#define CPU_TYPE_SPARC        ((cpu_type_t) 14)
#define CPU_TYPE_I860         ((cpu_type_t) 15)
#define CPU_TYPE_POWERPC      ((cpu_type_t) 18)
#define CPU_TYPE_POWERPC64    (CPU_TYPE_POWERPC | CPU_ARCH_ABI64)

/*
 * Machine subtypes (these are defined here, instead of in a machine
 * dependent directory, so that any program can get all definitions
 * regardless of where is it compiled).
 */

/*
 * Object files that are hand-crafted to run on any
 * implementation of an architecture are tagged with
 * CPU_SUBTYPE_MULTIPLE.  This functions essentially the same as
 * the "ALL" subtype of an architecture except that it allows us
 * to easily find object files that may need to be modified
 * whenever a new implementation of an architecture comes out.
 *
 * It is the responsibility of the implementor to make sure the
 * software handles unsupported implementations elegantly.
 */
#define     CPU_SUBTYPE_MULTIPLE          ((cpu_subtype_t) -1)
#define CPU_SUBTYPE_LITTLE_ENDIAN   ((cpu_subtype_t) 0)
#define CPU_SUBTYPE_BIG_ENDIAN            ((cpu_subtype_t) 1)

/*
 * Machine threadtypes.
 * This is none - not defined - for most machine types/subtypes.
 */
#define CPU_THREADTYPE_NONE         ((cpu_threadtype_t) 0)

/*
 * VAX subtypes (these do *not* necessary conform to the actual cpu
 * ID assigned by DEC available via the SID register).
 */

#define     CPU_SUBTYPE_VAX_ALL     ((cpu_subtype_t) 0) 
#define CPU_SUBTYPE_VAX780    ((cpu_subtype_t) 1)
#define CPU_SUBTYPE_VAX785    ((cpu_subtype_t) 2)
#define CPU_SUBTYPE_VAX750    ((cpu_subtype_t) 3)
#define CPU_SUBTYPE_VAX730    ((cpu_subtype_t) 4)
#define CPU_SUBTYPE_UVAXI     ((cpu_subtype_t) 5)
#define CPU_SUBTYPE_UVAXII    ((cpu_subtype_t) 6)
#define CPU_SUBTYPE_VAX8200   ((cpu_subtype_t) 7)
#define CPU_SUBTYPE_VAX8500   ((cpu_subtype_t) 8)
#define CPU_SUBTYPE_VAX8600   ((cpu_subtype_t) 9)
#define CPU_SUBTYPE_VAX8650   ((cpu_subtype_t) 10)
#define CPU_SUBTYPE_VAX8800   ((cpu_subtype_t) 11)
#define CPU_SUBTYPE_UVAXIII   ((cpu_subtype_t) 12)

/*
 * 680x0 subtypes
 *
 * The subtype definitions here are unusual for historical reasons.
 * NeXT used to consider 68030 code as generic 68000 code.  For
 * backwards compatability:
 *
 * CPU_SUBTYPE_MC68030 symbol has been preserved for source code
 * compatability.
 *
 * CPU_SUBTYPE_MC680x0_ALL has been defined to be the same
 * subtype as CPU_SUBTYPE_MC68030 for binary comatability.
 *
 * CPU_SUBTYPE_MC68030_ONLY has been added to allow new object
 * files to be tagged as containing 68030-specific instructions.
 */

#define     CPU_SUBTYPE_MC680x0_ALL       ((cpu_subtype_t) 1)
#define CPU_SUBTYPE_MC68030         ((cpu_subtype_t) 1) /* compat */
#define CPU_SUBTYPE_MC68040         ((cpu_subtype_t) 2) 
#define     CPU_SUBTYPE_MC68030_ONLY      ((cpu_subtype_t) 3)

/*
 * I386 subtypes
 */

#define CPU_SUBTYPE_INTEL(f, m)     ((cpu_subtype_t) (f) + ((m) << 4))

#define     CPU_SUBTYPE_I386_ALL                CPU_SUBTYPE_INTEL(3, 0)
#define CPU_SUBTYPE_386                         CPU_SUBTYPE_INTEL(3, 0)
#define CPU_SUBTYPE_486                         CPU_SUBTYPE_INTEL(4, 0)
#define CPU_SUBTYPE_486SX                       CPU_SUBTYPE_INTEL(4, 8) // 8 << 4 = 128
#define CPU_SUBTYPE_586                         CPU_SUBTYPE_INTEL(5, 0)
#define CPU_SUBTYPE_PENT      CPU_SUBTYPE_INTEL(5, 0)
#define CPU_SUBTYPE_PENTPRO   CPU_SUBTYPE_INTEL(6, 1)
#define CPU_SUBTYPE_PENTII_M3 CPU_SUBTYPE_INTEL(6, 3)
#define CPU_SUBTYPE_PENTII_M5 CPU_SUBTYPE_INTEL(6, 5)
#define CPU_SUBTYPE_CELERON                     CPU_SUBTYPE_INTEL(7, 6)
#define CPU_SUBTYPE_CELERON_MOBILE        CPU_SUBTYPE_INTEL(7, 7)
#define CPU_SUBTYPE_PENTIUM_3             CPU_SUBTYPE_INTEL(8, 0)
#define CPU_SUBTYPE_PENTIUM_3_M                 CPU_SUBTYPE_INTEL(8, 1)
#define CPU_SUBTYPE_PENTIUM_3_XEON        CPU_SUBTYPE_INTEL(8, 2)
#define CPU_SUBTYPE_PENTIUM_M             CPU_SUBTYPE_INTEL(9, 0)
#define CPU_SUBTYPE_PENTIUM_4             CPU_SUBTYPE_INTEL(10, 0)
#define CPU_SUBTYPE_PENTIUM_4_M                 CPU_SUBTYPE_INTEL(10, 1)
#define CPU_SUBTYPE_ITANIUM                     CPU_SUBTYPE_INTEL(11, 0)
#define CPU_SUBTYPE_ITANIUM_2             CPU_SUBTYPE_INTEL(11, 1)
#define CPU_SUBTYPE_XEON                        CPU_SUBTYPE_INTEL(12, 0)
#define CPU_SUBTYPE_XEON_MP                     CPU_SUBTYPE_INTEL(12, 1)

#define CPU_SUBTYPE_INTEL_FAMILY(x) ((x) & 15)
#define CPU_SUBTYPE_INTEL_FAMILY_MAX      15

#define CPU_SUBTYPE_INTEL_MODEL(x)  ((x) >> 4)
#define CPU_SUBTYPE_INTEL_MODEL_ALL 0

/*
 * X86 subtypes.
 */

#define CPU_SUBTYPE_X86_ALL         ((cpu_subtype_t)3)
#define CPU_SUBTYPE_X86_64_ALL            ((cpu_subtype_t)3)
#define CPU_SUBTYPE_X86_ARCH1       ((cpu_subtype_t)4)


#define CPU_THREADTYPE_INTEL_HTT    ((cpu_threadtype_t) 1)

/*
 * Mips subtypes.
 */

#define     CPU_SUBTYPE_MIPS_ALL    ((cpu_subtype_t) 0)
#define CPU_SUBTYPE_MIPS_R2300      ((cpu_subtype_t) 1)
#define CPU_SUBTYPE_MIPS_R2600      ((cpu_subtype_t) 2)
#define CPU_SUBTYPE_MIPS_R2800      ((cpu_subtype_t) 3)
#define CPU_SUBTYPE_MIPS_R2000a     ((cpu_subtype_t) 4)     /* pmax */
#define CPU_SUBTYPE_MIPS_R2000      ((cpu_subtype_t) 5)
#define CPU_SUBTYPE_MIPS_R3000a     ((cpu_subtype_t) 6)     /* 3max */
#define CPU_SUBTYPE_MIPS_R3000      ((cpu_subtype_t) 7)

/*
 * MC98000 (PowerPC) subtypes
 */

#define     CPU_SUBTYPE_MC98000_ALL ((cpu_subtype_t) 0)
#define CPU_SUBTYPE_MC98601   ((cpu_subtype_t) 1)

/*
 * HPPA subtypes for Hewlett-Packard HP-PA family of
 * risc processors. Port by NeXT to 700 series. 
 */

#define     CPU_SUBTYPE_HPPA_ALL          ((cpu_subtype_t) 0)
#define CPU_SUBTYPE_HPPA_7100       ((cpu_subtype_t) 0) /* compat */
#define CPU_SUBTYPE_HPPA_7100LC           ((cpu_subtype_t) 1)

/*
 * MC88000 subtypes.
 */

#define     CPU_SUBTYPE_MC88000_ALL ((cpu_subtype_t) 0)
#define CPU_SUBTYPE_MC88100   ((cpu_subtype_t) 1)
#define CPU_SUBTYPE_MC88110   ((cpu_subtype_t) 2)

/*
 * SPARC subtypes
 */

#define     CPU_SUBTYPE_SPARC_ALL         ((cpu_subtype_t) 0)

/*
 * I860 subtypes
 */

#define CPU_SUBTYPE_I860_ALL  ((cpu_subtype_t) 0)
#define CPU_SUBTYPE_I860_860  ((cpu_subtype_t) 1)

/*
 * PowerPC subtypes
 */

#define CPU_SUBTYPE_POWERPC_ALL           ((cpu_subtype_t) 0)
#define CPU_SUBTYPE_POWERPC_601           ((cpu_subtype_t) 1)
#define CPU_SUBTYPE_POWERPC_602           ((cpu_subtype_t) 2)
#define CPU_SUBTYPE_POWERPC_603           ((cpu_subtype_t) 3)
#define CPU_SUBTYPE_POWERPC_603e    ((cpu_subtype_t) 4)
#define CPU_SUBTYPE_POWERPC_603ev   ((cpu_subtype_t) 5)
#define CPU_SUBTYPE_POWERPC_604           ((cpu_subtype_t) 6)
#define CPU_SUBTYPE_POWERPC_604e    ((cpu_subtype_t) 7)
#define CPU_SUBTYPE_POWERPC_620           ((cpu_subtype_t) 8)
#define CPU_SUBTYPE_POWERPC_750           ((cpu_subtype_t) 9)
#define CPU_SUBTYPE_POWERPC_7400    ((cpu_subtype_t) 10)
#define CPU_SUBTYPE_POWERPC_7450    ((cpu_subtype_t) 11)
#define CPU_SUBTYPE_POWERPC_970           ((cpu_subtype_t) 100)

/*
 * The load commands directly follow the mach_header.  The total size of all
 * of the commands is given by the sizeofcmds field in the mach_header.  All
 * load commands must have as their first two fields cmd and cmdsize.  The cmd
 * field is filled in with a constant for that command type.  Each command type
 * has a structure specifically for it.  The cmdsize field is the size in bytes
 * of the particular load command structure plus anything that follows it that
 * is a part of the load command (i.e. section structures, strings, etc.).  To
 * advance to the next load command the cmdsize can be added to the offset or
 * pointer of the current load command.  The cmdsize for 32-bit architectures
 * MUST be a multiple of 4 bytes and for 64-bit architectures MUST be a multiple
 * of 8 bytes (these are forever the maximum alignment of any load commands).
 * The padded bytes must be zero.  All tables in the object file must also
 * follow these rules so the file can be memory mapped.  Otherwise the pointers
 * to these tables will not work well or at all on some machines.  With all
 * padding zeroed like objects will compare byte for byte.
 */
00403 struct load_command {
      ut32 cmd;         /* type of load command */
      ut32 cmdsize;     /* total size of command in bytes */
};

/*
 * After MacOS X 10.1 when a new load command is added that is required to be
 * understood by the dynamic linker for the image to execute properly the
 * LC_REQ_DYLD bit will be or'ed into the load command constant.  If the dynamic
 * linker sees such a load command it it does not understand will issue a
 * "unknown load command required for execution" error and refuse to use the
 * image.  Other load commands without this bit that are not understood will
 * simply be ignored.
 */
#define LC_REQ_DYLD 0x80000000

/* Constants for the cmd field of all load commands, the type */
#define     LC_SEGMENT  0x1   /* segment of this file to be mapped */
#define     LC_SYMTAB   0x2   /* link-edit stab symbol table info */
#define     LC_SYMSEG   0x3   /* link-edit gdb symbol table info (obsolete) */
#define     LC_THREAD   0x4   /* thread */
#define     LC_UNIXTHREAD     0x5   /* unix thread (includes a stack) */
#define     LC_LOADFVMLIB     0x6   /* load a specified fixed VM shared library */
#define     LC_IDFVMLIB 0x7   /* fixed VM shared library identification */
#define     LC_IDENT    0x8   /* object identification info (obsolete) */
#define LC_FVMFILE      0x9   /* fixed VM file inclusion (internal use) */
#define LC_PREPAGE      0xa     /* prepage command (internal use) */
#define     LC_DYSYMTAB 0xb   /* dynamic link-edit symbol table info */
#define     LC_LOAD_DYLIB     0xc   /* load a dynamically linked shared library */
#define     LC_ID_DYLIB 0xd   /* dynamically linked shared lib ident */
#define LC_LOAD_DYLINKER 0xe  /* load a dynamic linker */
#define LC_ID_DYLINKER  0xf   /* dynamic linker identification */
#define     LC_PREBOUND_DYLIB 0x10  /* modules prebound for a dynamically */
                        /*  linked shared library */
#define     LC_ROUTINES 0x11  /* image routines */
#define     LC_SUB_FRAMEWORK 0x12   /* sub framework */
#define     LC_SUB_UMBRELLA 0x13    /* sub umbrella */
#define     LC_SUB_CLIENT     0x14  /* sub client */
#define     LC_SUB_LIBRARY  0x15    /* sub library */
#define     LC_TWOLEVEL_HINTS 0x16  /* two-level namespace lookup hints */
#define     LC_PREBIND_CKSUM  0x17  /* prebind checksum */

/*
 * load a dynamically linked shared library that is allowed to be missing
 * (all symbols are weak imported).
 */
#define     LC_LOAD_WEAK_DYLIB (0x18 | LC_REQ_DYLD)

#define     LC_SEGMENT_64     0x19  /* 64-bit segment of this file to be
                           mapped */
#define     LC_ROUTINES_64    0x1a  /* 64-bit image routines */
#define LC_UUID         0x1b  /* the uuid */
#define LC_CODE_SIGNATURE 0x1d      /* local of code signature */

/*
 * A variable length string in a load command is represented by an lc_str
 * union.  The strings are stored just after the load command structure and
 * the offset is from the start of the load command structure.  The size
 * of the string is reflected in the cmdsize field of the load command.
 * Once again any padded bytes to bring the cmdsize field to a multiple
 * of 4 bytes must be zero.
 */
00465 union lc_str {
      ut32  offset;     /* offset to the string */
#ifndef __LP64__
      char        *ptr; /* pointer to the string */
#endif 
};

/*
 * The segment load command indicates that a part of this file is to be
 * mapped into the task's address space.  The size of this segment in memory,
 * vmsize, maybe equal to or larger than the amount to map from this file,
 * filesize.  The file is mapped starting at fileoff to the beginning of
 * the segment in memory, vmaddr.  The rest of the memory of the segment,
 * if any, is allocated zero fill on demand.  The segment's maximum virtual
 * memory protection and initial virtual memory protection are specified
 * by the maxprot and initprot fields.  If the segment has sections then the
 * section structures directly follow the segment command and their size is
 * reflected in cmdsize.
 */
00484 struct segment_command { /* for 32-bit architectures */
      ut32  cmd;        /* LC_SEGMENT */
      ut32  cmdsize;    /* includes sizeof section structs */
      char        segname[16];      /* segment name */
      ut32  vmaddr;           /* memory address of this segment */
      ut32  vmsize;           /* memory size of this segment */
      ut32  fileoff;    /* file offset of this segment */
      ut32  filesize;   /* amount to map from the file */
      vm_prot_t   maxprot;    /* maximum VM protection */
      vm_prot_t   initprot;   /* initial VM protection */
      ut32  nsects;           /* number of sections in segment */
      ut32  flags;            /* flags */
};

/*
 * The 64-bit segment load command indicates that a part of this file is to be
 * mapped into a 64-bit task's address space.  If the 64-bit segment has
 * sections then section_64 structures directly follow the 64-bit segment
 * command and their size is reflected in cmdsize.
 */
00504 struct segment_command_64 { /* for 64-bit architectures */
      ut32  cmd;        /* LC_SEGMENT_64 */
      ut32  cmdsize;    /* includes sizeof section_64 structs */
      char        segname[16];      /* segment name */
      ut64  vmaddr;           /* memory address of this segment */
      ut64  vmsize;           /* memory size of this segment */
      ut64  fileoff;    /* file offset of this segment */
      ut64  filesize;   /* amount to map from the file */
      vm_prot_t   maxprot;    /* maximum VM protection */
      vm_prot_t   initprot;   /* initial VM protection */
      ut32  nsects;           /* number of sections in segment */
      ut32  flags;            /* flags */
};

/* Constants for the flags field of the segment_command */
#define     SG_HIGHVM   0x1   /* the file contents for this segment is for
                           the high part of the VM space, the low part
                           is zero filled (for stacks in core files) */
#define     SG_FVMLIB   0x2   /* this segment is the VM that is allocated by
                           a fixed VM library, for overlap checking in
                           the link editor */
#define     SG_NORELOC  0x4   /* this segment has nothing that was relocated
                           in it and nothing relocated to it, that is
                           it maybe safely replaced without relocation*/
#define SG_PROTECTED_VERSION_1      0x8 /* This segment is protected.  If the
                               segment starts at file offset 0, the
                               first page of the segment is not
                               protected.  All other pages of the
                               segment are protected. */

/*
 * A segment is made up of zero or more sections.  Non-MH_OBJECT files have
 * all of their segments with the proper sections in each, and padded to the
 * specified segment alignment when produced by the link editor.  The first
 * segment of a MH_EXECUTE and MH_FVMLIB format file contains the mach_header
 * and load commands of the object file before its first section.  The zero
 * fill sections are always last in their segment (in all formats).  This
 * allows the zeroed segment padding to be mapped into memory where zero fill
 * sections might be. The gigabyte zero fill sections, those with the section
 * type S_GB_ZEROFILL, can only be in a segment with sections of this type.
 * These segments are then placed after all other segments.
 *
 * The MH_OBJECT format has all of its sections in one segment for
 * compactness.  There is no padding to a specified segment boundary and the
 * mach_header and load commands are not part of the segment.
 *
 * Sections with the same section name, sectname, going into the same segment,
 * segname, are combined by the link editor.  The resulting section is aligned
 * to the maximum alignment of the combined sections and is the new section's
 * alignment.  The combined sections are aligned to their original alignment in
 * the combined section.  Any padded bytes to get the specified alignment are
 * zeroed.
 *
 * The format of the relocation entries referenced by the reloff and nreloc
 * fields of the section structure for mach object files is described in the
 * header file <reloc.h>.
 */
00561 struct section { /* for 32-bit architectures */
      char        sectname[16];     /* name of this section */
      char        segname[16];      /* segment this section goes in */
      ut32  addr;       /* memory address of this section */
      ut32  size;       /* size in bytes of this section */
      ut32  offset;           /* file offset of this section */
      ut32  align;            /* section alignment (power of 2) */
      ut32  reloff;           /* file offset of relocation entries */
      ut32  nreloc;           /* number of relocation entries */
      ut32  flags;            /* flags (section type and attributes)*/
      ut32  reserved1;  /* reserved (for offset or index) */
      ut32  reserved2;  /* reserved (for count or sizeof) */
};

00575 struct section_64 { /* for 64-bit architectures */
      char        sectname[16];     /* name of this section */
      char        segname[16];      /* segment this section goes in */
      ut64  addr;       /* memory address of this section */
      ut64  size;       /* size in bytes of this section */
      ut32  offset;           /* file offset of this section */
      ut32  align;            /* section alignment (power of 2) */
      ut32  reloff;           /* file offset of relocation entries */
      ut32  nreloc;           /* number of relocation entries */
      ut32  flags;            /* flags (section type and attributes)*/
      ut32  reserved1;  /* reserved (for offset or index) */
      ut32  reserved2;  /* reserved (for count or sizeof) */
      ut32  reserved3;  /* reserved */
};

/*
 * The flags field of a section structure is separated into two parts a section
 * type and section attributes.  The section types are mutually exclusive (it
 * can only have one type) but the section attributes are not (it may have more
 * than one attribute).
 */
#define SECTION_TYPE           0x000000ff /* 256 section types */
#define SECTION_ATTRIBUTES     0xffffff00 /*  24 section attributes */

/* Constants for the type of a section */
#define     S_REGULAR         0x0   /* regular section */
#define     S_ZEROFILL        0x1   /* zero fill on demand section */
#define     S_CSTRING_LITERALS      0x2   /* section with only literal C strings*/
#define     S_4BYTE_LITERALS  0x3   /* section with only 4 byte literals */
#define     S_8BYTE_LITERALS  0x4   /* section with only 8 byte literals */
#define     S_LITERAL_POINTERS      0x5   /* section with only pointers to */
                              /*  literals */
/*
 * For the two types of symbol pointers sections and the symbol stubs section
 * they have indirect symbol table entries.  For each of the entries in the
 * section the indirect symbol table entries, in corresponding order in the
 * indirect symbol table, start at the index stored in the reserved1 field
 * of the section structure.  Since the indirect symbol table entries
 * correspond to the entries in the section the number of indirect symbol table
 * entries is inferred from the size of the section divided by the size of the
 * entries in the section.  For symbol pointers sections the size of the entries
 * in the section is 4 bytes and for symbol stubs sections the byte size of the
 * stubs is stored in the reserved2 field of the section structure.
 */
#define     S_NON_LAZY_SYMBOL_POINTERS    0x6   /* section with only non-lazy
                                       symbol pointers */
#define     S_LAZY_SYMBOL_POINTERS        0x7   /* section with only lazy symbol
                                       pointers */
#define     S_SYMBOL_STUBS                0x8   /* section with only symbol
                                       stubs, byte size of stub in
                                       the reserved2 field */
#define     S_MOD_INIT_FUNC_POINTERS      0x9   /* section with only function
                                       pointers for initialization*/
#define     S_MOD_TERM_FUNC_POINTERS      0xa   /* section with only function
                                       pointers for termination */
#define     S_COALESCED             0xb   /* section contains symbols that
                                       are to be coalesced */
#define     S_GB_ZEROFILL                 0xc   /* zero fill on demand section
                                       (that can be larger than 4
                                       gigabytes) */
#define     S_INTERPOSING                 0xd   /* section with only pairs of
                                       function pointers for
                                       interposing */
#define     S_16BYTE_LITERALS 0xe   /* section with only 16 byte literals */
/*
 * Constants for the section attributes part of the flags field of a section
 * structure.
 */
#define SECTION_ATTRIBUTES_USR       0xff000000 /* User setable attributes */
#define S_ATTR_PURE_INSTRUCTIONS 0x80000000     /* section contains only true
                                       machine instructions */
#define S_ATTR_NO_TOC          0x40000000 /* section contains coalesced
                                       symbols that are not to be
                                       in a ranlib table of
                                       contents */
#define S_ATTR_STRIP_STATIC_SYMS 0x20000000     /* ok to strip static symbols
                                       in this section in files
                                       with the MH_DYLDLINK flag */
#define S_ATTR_NO_DEAD_STRIP   0x10000000 /* no dead stripping */
#define S_ATTR_LIVE_SUPPORT    0x08000000 /* blocks are live if they
                                       reference live blocks */
#define S_ATTR_SELF_MODIFYING_CODE 0x04000000   /* Used with i386 code stubs
                                       written on by dyld */
/*
 * If a segment contains any sections marked with S_ATTR_DEBUG then all
 * sections in that segment must have this attribute.  No section other than
 * a section marked with this attribute may reference the contents of this
 * section.  A section with this attribute may contain no symbols and must have
 * a section type S_REGULAR.  The static linker will not copy section contents
 * from sections with this attribute into its output file.  These sections
 * generally contain DWARF debugging info.
 */ 
#define     S_ATTR_DEBUG             0x02000000 /* a debug section */
#define SECTION_ATTRIBUTES_SYS       0x00ffff00 /* system setable attributes */
#define S_ATTR_SOME_INSTRUCTIONS 0x00000400     /* section contains some
                                       machine instructions */
#define S_ATTR_EXT_RELOC       0x00000200 /* section has external
                                       relocation entries */
#define S_ATTR_LOC_RELOC       0x00000100 /* section has local
                                       relocation entries */


/*
 * The names of segments and sections in them are mostly meaningless to the
 * link-editor.  But there are few things to support traditional UNIX
 * executables that require the link-editor and assembler to use some names
 * agreed upon by convention.
 *
 * The initial protection of the "__TEXT" segment has write protection turned
 * off (not writeable).
 *
 * The link-editor will allocate common symbols at the end of the "__common"
 * section in the "__DATA" segment.  It will create the section and segment
 * if needed.
 */

/* The currently known segment names and the section names in those segments */

#define     SEG_PAGEZERO      "__PAGEZERO"      /* the pagezero segment which has no */
                              /* protections and catches NULL */
                              /* references for MH_EXECUTE files */


#define     SEG_TEXT    "__TEXT"    /* the tradition UNIX text segment */
#define     SECT_TEXT   "__text"    /* the real text part of the text */
                              /* section no headers, and no padding */
#define SECT_FVMLIB_INIT0 "__fvmlib_init0"      /* the fvmlib initialization */
                                    /*  section */
#define SECT_FVMLIB_INIT1 "__fvmlib_init1"      /* the section following the */
                                      /*  fvmlib initialization */
                                    /*  section */

#define     SEG_DATA    "__DATA"    /* the tradition UNIX data segment */
#define     SECT_DATA   "__data"    /* the real initialized data section */
                              /* no padding, no bss overlap */
#define     SECT_BSS    "__bss"           /* the real uninitialized data section*/
                              /* no padding */
#define SECT_COMMON     "__common"  /* the section common symbols are */
                              /* allocated in by the link editor */

#define     SEG_OBJC    "__OBJC"    /* objective-C runtime segment */
#define SECT_OBJC_SYMBOLS "__symbol_table"      /* symbol table */
#define SECT_OBJC_MODULES "__module_info" /* module information */
#define SECT_OBJC_STRINGS "__selector_strs"     /* string table */
#define SECT_OBJC_REFS "__selector_refs"  /* string table */

#define     SEG_ICON     "__ICON"   /* the icon segment */
#define     SECT_ICON_HEADER "__header"   /* the icon headers */
#define     SECT_ICON_TIFF   "__tiff"     /* the icons in tiff format */

#define     SEG_LINKEDIT      "__LINKEDIT"      /* the segment containing all structs */
                              /* created and maintained by the link */
                              /* editor.  Created with -seglinkedit */
                              /* option to ld(1) for MH_EXECUTE and */
                              /* FVMLIB file types only */

#define SEG_UNIXSTACK   "__UNIXSTACK"     /* the unix stack segment */

#define SEG_IMPORT      "__IMPORT"  /* the segment for the self (dyld) */
                              /* modifing code stubs that has read, */
                              /* write and execute permissions */

/*
 * Fixed virtual memory shared libraries are identified by two things.  The
 * target pathname (the name of the library as found for execution), and the
 * minor version number.  The address of where the headers are loaded is in
 * header_addr. (THIS IS OBSOLETE and no longer supported).
 */
00743 struct fvmlib {
      union lc_str      name;       /* library's target pathname */
      ut32  minor_version;    /* library's minor version number */
      ut32  header_addr;      /* library's header address */
};

/*
 * A fixed virtual shared library (filetype == MH_FVMLIB in the mach header)
 * contains a fvmlib_command (cmd == LC_IDFVMLIB) to identify the library.
 * An object that uses a fixed virtual shared library also contains a
 * fvmlib_command (cmd == LC_LOADFVMLIB) for each library it uses.
 * (THIS IS OBSOLETE and no longer supported).
 */
00756 struct fvmlib_command {
      ut32  cmd;        /* LC_IDFVMLIB or LC_LOADFVMLIB */
      ut32  cmdsize;    /* includes pathname string */
      struct fvmlib     fvmlib;           /* the library identification */
};

/*
 * Dynamicly linked shared libraries are identified by two things.  The
 * pathname (the name of the library as found for execution), and the
 * compatibility version number.  The pathname must match and the compatibility
 * number in the user of the library must be greater than or equal to the
 * library being used.  The time stamp is used to record the time a library was
 * built and copied into user so it can be use to determined if the library used
 * at runtime is exactly the same as used to built the program.
 */
00771 struct dylib {
    union lc_str  name;             /* library's path name */
    ut32 timestamp;                 /* library's build time stamp */
    ut32 current_version;           /* library's current version number */
    ut32 compatibility_version;     /* library's compatibility vers number*/
};

/*
 * A dynamically linked shared library (filetype == MH_DYLIB in the mach header)
 * contains a dylib_command (cmd == LC_ID_DYLIB) to identify the library.
 * An object that uses a dynamically linked shared library also contains a
 * dylib_command (cmd == LC_LOAD_DYLIB or cmd == LC_LOAD_WEAK_DYLIB) for each
 * library it uses.
 */
00785 struct dylib_command {
      ut32  cmd;        /* LC_ID_DYLIB, LC_LOAD_{,WEAK_}DYLIB */
      ut32  cmdsize;    /* includes pathname string */
      struct dylib      dylib;            /* the library identification */
};

/*
 * A dynamically linked shared library may be a subframework of an umbrella
 * framework.  If so it will be linked with "-umbrella umbrella_name" where
 * Where "umbrella_name" is the name of the umbrella framework. A subframework
 * can only be linked against by its umbrella framework or other subframeworks
 * that are part of the same umbrella framework.  Otherwise the static link
 * editor produces an error and states to link against the umbrella framework.
 * The name of the umbrella framework for subframeworks is recorded in the
 * following structure.
 */
00801 struct sub_framework_command {
      ut32  cmd;        /* LC_SUB_FRAMEWORK */
      ut32  cmdsize;    /* includes umbrella string */
      union lc_str      umbrella;   /* the umbrella framework name */
};

/*
 * For dynamically linked shared libraries that are subframework of an umbrella
 * framework they can allow clients other than the umbrella framework or other
 * subframeworks in the same umbrella framework.  To do this the subframework
 * is built with "-allowable_client client_name" and an LC_SUB_CLIENT load
 * command is created for each -allowable_client flag.  The client_name is
 * usually a framework name.  It can also be a name used for bundles clients
 * where the bundle is built with "-client_name client_name".
 */
00816 struct sub_client_command {
      ut32  cmd;        /* LC_SUB_CLIENT */
      ut32  cmdsize;    /* includes client string */
      union lc_str      client;           /* the client name */
};

/*
 * A dynamically linked shared library may be a sub_umbrella of an umbrella
 * framework.  If so it will be linked with "-sub_umbrella umbrella_name" where
 * Where "umbrella_name" is the name of the sub_umbrella framework.  When
 * staticly linking when -twolevel_namespace is in effect a twolevel namespace 
 * umbrella framework will only cause its subframeworks and those frameworks
 * listed as sub_umbrella frameworks to be implicited linked in.  Any other
 * dependent dynamic libraries will not be linked it when -twolevel_namespace
 * is in effect.  The primary library recorded by the static linker when
 * resolving a symbol in these libraries will be the umbrella framework.
 * Zero or more sub_umbrella frameworks may be use by an umbrella framework.
 * The name of a sub_umbrella framework is recorded in the following structure.
 */
00835 struct sub_umbrella_command {
      ut32  cmd;        /* LC_SUB_UMBRELLA */
      ut32  cmdsize;    /* includes sub_umbrella string */
      union lc_str      sub_umbrella;     /* the sub_umbrella framework name */
};

/*
 * A dynamically linked shared library may be a sub_library of another shared
 * library.  If so it will be linked with "-sub_library library_name" where
 * Where "library_name" is the name of the sub_library shared library.  When
 * staticly linking when -twolevel_namespace is in effect a twolevel namespace 
 * shared library will only cause its subframeworks and those frameworks
 * listed as sub_umbrella frameworks and libraries listed as sub_libraries to
 * be implicited linked in.  Any other dependent dynamic libraries will not be
 * linked it when -twolevel_namespace is in effect.  The primary library
 * recorded by the static linker when resolving a symbol in these libraries
 * will be the umbrella framework (or dynamic library). Zero or more sub_library
 * shared libraries may be use by an umbrella framework or (or dynamic library).
 * The name of a sub_library framework is recorded in the following structure.
 * For example /usr/lib/libobjc_profile.A.dylib would be recorded as "libobjc".
 */
00856 struct sub_library_command {
      ut32  cmd;        /* LC_SUB_LIBRARY */
      ut32  cmdsize;    /* includes sub_library string */
      union lc_str      sub_library;      /* the sub_library name */
};

/*
 * A program (filetype == MH_EXECUTE) that is
 * prebound to its dynamic libraries has one of these for each library that
 * the static linker used in prebinding.  It contains a bit vector for the
 * modules in the library.  The bits indicate which modules are bound (1) and
 * which are not (0) from the library.  The bit for module 0 is the low bit
 * of the first byte.  So the bit for the Nth module is:
 * (linked_modules[N/8] >> N%8) & 1
 */
00871 struct prebound_dylib_command {
      ut32  cmd;        /* LC_PREBOUND_DYLIB */
      ut32  cmdsize;    /* includes strings */
      union lc_str      name;       /* library's path name */
      ut32  nmodules;   /* number of modules in library */
      union lc_str      linked_modules;   /* bit vector of linked modules */
};

/*
 * A program that uses a dynamic linker contains a dylinker_command to identify
 * the name of the dynamic linker (LC_LOAD_DYLINKER).  And a dynamic linker
 * contains a dylinker_command to identify the dynamic linker (LC_ID_DYLINKER).
 * A file can have at most one of these.
 */
00885 struct dylinker_command {
      ut32  cmd;        /* LC_ID_DYLINKER or LC_LOAD_DYLINKER */
      ut32  cmdsize;    /* includes pathname string */
      union lc_str    name;         /* dynamic linker's path name */
};

/*
 * Thread commands contain machine-specific data structures suitable for
 * use in the thread state primitives.  The machine specific data structures
 * follow the struct thread_command as follows.
 * Each flavor of machine specific data structure is preceded by an unsigned
 * long constant for the flavor of that data structure, an ut32
 * that is the count of longs of the size of the state data structure and then
 * the state data structure follows.  This triple may be repeated for many
 * flavors.  The constants for the flavors, counts and state data structure
 * definitions are expected to be in the header file <machine/thread_status.h>.
 * These machine specific data structures sizes must be multiples of
 * 4 bytes  The cmdsize reflects the total size of the thread_command
 * and all of the sizes of the constants for the flavors, counts and state
 * data structures.
 *
 * For executable objects that are unix processes there will be one
 * thread_command (cmd == LC_UNIXTHREAD) created for it by the link-editor.
 * This is the same as a LC_THREAD, except that a stack is automatically
 * created (based on the shell's limit for the stack size).  Command arguments
 * and environment variables are copied onto that stack.
 */
00912 struct thread_command {
      ut32  cmd;        /* LC_THREAD or  LC_UNIXTHREAD */
      ut32  cmdsize;    /* total size of this command */
      ut32  flavor;
      ut32  count;
      /* ut32 flavor             flavor of thread state */
      /* ut32 count              count of longs in thread state */
      /* struct XXX_thread_state state   thread state for this flavor */
      /* ... */
};

00923 struct x86_thread_state32 {
      ut32  eax;
      ut32  ebx;
      ut32  ecx;
      ut32  edx;
      ut32  edi;
      ut32  esi;
      ut32  ebp;
      ut32  esp;
      ut32  ss;
      ut32  eflags;
      ut32  eip;
      ut32  cs;
      ut32  ds;
      ut32  es;
      ut32  fs;
      ut32  gs;
} ;

00942 struct x86_thread_state64 {
      ut64  rax;
      ut64  rbx;
      ut64  rcx;
      ut64  rdx;
      ut64  rdi;
      ut64  rsi;
      ut64  rbp;
      ut64  rsp;
      ut64  r8;
      ut64  r9;
      ut64  r10;
      ut64  r11;
      ut64  r12;
      ut64  r13;
      ut64  r14;
      ut64  r15;
      ut64  rip;
      ut64  rflags;
      ut64  cs;
      ut64  fs;
      ut64  gs;
};

#define X86_THREAD_STATE32    1
#define X86_THREAD_STATE64    4

00969 struct ppc_thread_state32 {
      ut32 srr0;  /* Instruction address register (PC) */
      ut32 srr1;  /* Machine state register (supervisor) */
      ut32 r0;
      ut32 r1;
      ut32 r2;
      ut32 r3;
      ut32 r4;
      ut32 r5;
      ut32 r6;
      ut32 r7;
      ut32 r8;
      ut32 r9;
      ut32 r10;
      ut32 r11;
      ut32 r12;
      ut32 r13;
      ut32 r14;
      ut32 r15;
      ut32 r16;
      ut32 r17;
      ut32 r18;
      ut32 r19;
      ut32 r20;
      ut32 r21;
      ut32 r22;
      ut32 r23;
      ut32 r24;
      ut32 r25;
      ut32 r26;
      ut32 r27;
      ut32 r28;
      ut32 r29;
      ut32 r30;
      ut32 r31;

      ut32 cr;    /* Condition register */
      ut32 xer;   /* User's integer exception register */
      ut32 lr;    /* Link register */
      ut32 ctr;   /* Count register */
      ut32 mq;    /* MQ register (601 only) */

      ut32 vrsave;      /* Vector Save Register */
};

01014 struct ppc_thread_state64 {
      ut64 srr0;  /* Instruction address register (PC) */
      ut64 srr1;  /* Machine state register (supervisor) */
      ut64 r0;
      ut64 r1;
      ut64 r2;
      ut64 r3;
      ut64 r4;
      ut64 r5;
      ut64 r6;
      ut64 r7;
      ut64 r8;
      ut64 r9;
      ut64 r10;
      ut64 r11;
      ut64 r12;
      ut64 r13;
      ut64 r14;
      ut64 r15;
      ut64 r16;
      ut64 r17;
      ut64 r18;
      ut64 r19;
      ut64 r20;
      ut64 r21;
      ut64 r22;
      ut64 r23;
      ut64 r24;
      ut64 r25;
      ut64 r26;
      ut64 r27;
      ut64 r28;
      ut64 r29;
      ut64 r30;
      ut64 r31;

      ut32 cr;                /* Condition register */
      ut64 xer;         /* User's integer exception register */
      ut64 lr;          /* Link register */
      ut64 ctr;         /* Count register */

      ut32 vrsave;            /* Vector Save Register */
};

01058 struct arm_thread_state {
      ut32 r0;
      ut32 r1;
      ut32 r2;
      ut32 r3;
      ut32 r4;
      ut32 r5;
      ut32 r6;
      ut32 r7;
      ut32 r8;
      ut32 r9;
      ut32 r10;
      ut32 r11;
      ut32 r12;
      ut32 r13;
      ut32 r14;
      ut32 r15;
      ut32 r16;   /* Apple's thread_state has this 17th reg, bug?? */
};

/*
 * The routines command contains the address of the dynamic shared library 
 * initialization routine and an index into the module table for the module
 * that defines the routine.  Before any modules are used from the library the
 * dynamic linker fully binds the module that defines the initialization routine
 * and then calls it.  This gets called before any module initialization
 * routines (used for C++ static constructors) in the library.
 */
01086 struct routines_command { /* for 32-bit architectures */
      ut32  cmd;        /* LC_ROUTINES */
      ut32  cmdsize;    /* total size of this command */
      ut32  init_address;     /* address of initialization routine */
      ut32  init_module;      /* index into the module table that */
                                /*  the init routine is defined in */
      ut32  reserved1;
      ut32  reserved2;
      ut32  reserved3;
      ut32  reserved4;
      ut32  reserved5;
      ut32  reserved6;
};

/*
 * The 64-bit routines command.  Same use as above.
 */
01103 struct routines_command_64 { /* for 64-bit architectures */
      ut32  cmd;        /* LC_ROUTINES_64 */
      ut32  cmdsize;    /* total size of this command */
      ut64  init_address;     /* address of initialization routine */
      ut64  init_module;      /* index into the module table that */
                              /*  the init routine is defined in */
      ut64  reserved1;
      ut64  reserved2;
      ut64  reserved3;
      ut64  reserved4;
      ut64  reserved5;
      ut64  reserved6;
};

/*
 * The symtab_command contains the offsets and sizes of the link-edit 4.3BSD
 * "stab" style symbol table information as described in the header files
 * <nlist.h> and <stab.h>.
 */
01122 struct symtab_command {
      ut32  cmd;        /* LC_SYMTAB */
      ut32  cmdsize;    /* sizeof(struct symtab_command) */
      ut32  symoff;           /* symbol table offset */
      ut32  nsyms;            /* number of symbol table entries */
      ut32  stroff;           /* string table offset */
      ut32  strsize;    /* string table size in bytes */
};

/*
 * This is the second set of the symbolic information which is used to support
 * the data structures for the dynamically link editor.
 *
 * The original set of symbolic information in the symtab_command which contains
 * the symbol and string tables must also be present when this load command is
 * present.  When this load command is present the symbol table is organized
 * into three groups of symbols:
 *    local symbols (static and debugging symbols) - grouped by module
 *    defined external symbols - grouped by module (sorted by name if not lib)
 *    undefined external symbols (sorted by name if MH_BINDATLOAD is not set,
 *                          and in order the were seen by the static
 *                          linker if MH_BINDATLOAD is set)
 * In this load command there are offsets and counts to each of the three groups
 * of symbols.
 *
 * This load command contains a the offsets and sizes of the following new
 * symbolic information tables:
 *    table of contents
 *    module table
 *    reference symbol table
 *    indirect symbol table
 * The first three tables above (the table of contents, module table and
 * reference symbol table) are only present if the file is a dynamically linked
 * shared library.  For executable and object modules, which are files
 * containing only one module, the information that would be in these three
 * tables is determined as follows:
 *    table of contents - the defined external symbols are sorted by name
 *    module table - the file contains only one module so everything in the
 *                 file is part of the module.
 *    reference symbol table - is the defined and undefined external symbols
 *
 * For dynamically linked shared library files this load command also contains
 * offsets and sizes to the pool of relocation entries for all sections
 * separated into two groups:
 *    external relocation entries
 *    local relocation entries
 * For executable and object modules the relocation entries continue to hang
 * off the section structures.
 */
01171 struct dysymtab_command {
    ut32 cmd;     /* LC_DYSYMTAB */
    ut32 cmdsize; /* sizeof(struct dysymtab_command) */

    /*
     * The symbols indicated by symoff and nsyms of the LC_SYMTAB load command
     * are grouped into the following three groups:
     *    local symbols (further grouped by the module they are from)
     *    defined external symbols (further grouped by the module they are from)
     *    undefined symbols
     *
     * The local symbols are used only for debugging.  The dynamic binding
     * process may have to use them to indicate to the debugger the local
     * symbols for a module that is being bound.
     *
     * The last two groups are used by the dynamic binding process to do the
     * binding (indirectly through the module table and the reference symbol
     * table when this is a dynamically linked shared library file).
     */
    ut32 ilocalsym;     /* index to local symbols */
    ut32 nlocalsym;     /* number of local symbols */

    ut32 iextdefsym;/* index to externally defined symbols */
    ut32 nextdefsym;/* number of externally defined symbols */

    ut32 iundefsym;     /* index to undefined symbols */
    ut32 nundefsym;     /* number of undefined symbols */

    /*
     * For the for the dynamic binding process to find which module a symbol
     * is defined in the table of contents is used (analogous to the ranlib
     * structure in an archive) which maps defined external symbols to modules
     * they are defined in.  This exists only in a dynamically linked shared
     * library file.  For executable and object modules the defined external
     * symbols are sorted by name and is use as the table of contents.
     */
    ut32 tocoff;  /* file offset to table of contents */
    ut32 ntoc;    /* number of entries in table of contents */

    /*
     * To support dynamic binding of "modules" (whole object files) the symbol
     * table must reflect the modules that the file was created from.  This is
     * done by having a module table that has indexes and counts into the merged
     * tables for each module.  The module structure that these two entries
     * refer to is described below.  This exists only in a dynamically linked
     * shared library file.  For executable and object modules the file only
     * contains one module so everything in the file belongs to the module.
     */
    ut32 modtaboff;     /* file offset to module table */
    ut32 nmodtab; /* number of module table entries */

    /*
     * To support dynamic module binding the module structure for each module
     * indicates the external references (defined and undefined) each module
     * makes.  For each module there is an offset and a count into the
     * reference symbol table for the symbols that the module references.
     * This exists only in a dynamically linked shared library file.  For
     * executable and object modules the defined external symbols and the
     * undefined external symbols indicates the external references.
     */
    ut32 extrefsymoff;  /* offset to referenced symbol table */
    ut32 nextrefsyms;   /* number of referenced symbol table entries */

    /*
     * The sections that contain "symbol pointers" and "routine stubs" have
     * indexes and (implied counts based on the size of the section and fixed
     * size of the entry) into the "indirect symbol" table for each pointer
     * and stub.  For every section of these two types the index into the
     * indirect symbol table is stored in the section header in the field
     * reserved1.  An indirect symbol table entry is simply a 32bit index into
     * the symbol table to the symbol that the pointer or stub is referring to.
     * The indirect symbol table is ordered to match the entries in the section.
     */
    ut32 indirectsymoff; /* file offset to the indirect symbol table */
    ut32 nindirectsyms;  /* number of indirect symbol table entries */

    /*
     * To support relocating an individual module in a library file quickly the
     * external relocation entries for each module in the library need to be
     * accessed efficiently.  Since the relocation entries can't be accessed
     * through the section headers for a library file they are separated into
     * groups of local and external entries further grouped by module.  In this
     * case the presents of this load command who's extreloff, nextrel,
     * locreloff and nlocrel fields are non-zero indicates that the relocation
     * entries of non-merged sections are not referenced through the section
     * structures (and the reloff and nreloc fields in the section headers are
     * set to zero).
     *
     * Since the relocation entries are not accessed through the section headers
     * this requires the r_address field to be something other than a section
     * offset to identify the item to be relocated.  In this case r_address is
     * set to the offset from the vmaddr of the first LC_SEGMENT command.
     * For MH_SPLIT_SEGS images r_address is set to the the offset from the
     * vmaddr of the first read-write LC_SEGMENT command.
     *
     * The relocation entries are grouped by module and the module table
     * entries have indexes and counts into them for the group of external
     * relocation entries for that the module.
     *
     * For sections that are merged across modules there must not be any
     * remaining external relocation entries for them (for merged sections
     * remaining relocation entries must be local).
     */
    ut32 extreloff;     /* offset to external relocation entries */
    ut32 nextrel; /* number of external relocation entries */

    /*
     * All the local relocation entries are grouped together (they are not
     * grouped by their module since they are only used if the object is moved
     * from it staticly link edited address).
     */
    ut32 locreloff;     /* offset to local relocation entries */
    ut32 nlocrel; /* number of local relocation entries */

};    

/*
 * An indirect symbol table entry is simply a 32bit index into the symbol table 
 * to the symbol that the pointer or stub is refering to.  Unless it is for a
 * non-lazy symbol pointer section for a defined symbol which strip(1) as 
 * removed.  In which case it has the value INDIRECT_SYMBOL_LOCAL.  If the
 * symbol was also absolute INDIRECT_SYMBOL_ABS is or'ed with that.
 */
#define INDIRECT_SYMBOL_LOCAL 0x80000000
#define INDIRECT_SYMBOL_ABS   0x40000000


/* a table of contents entry */
01299 struct dylib_table_of_contents {
    ut32 symbol_index;  /* the defined external symbol
                           (index into the symbol table) */
    ut32 module_index;  /* index into the module table this symbol
                           is defined in */
};    

/* a module table entry */
01307 struct dylib_module {
    ut32 module_name;   /* the module name (index into string table) */

    ut32 iextdefsym;    /* index into externally defined symbols */
    ut32 nextdefsym;    /* number of externally defined symbols */
    ut32 irefsym;       /* index into reference symbol table */
    ut32 nrefsym;       /* number of reference symbol table entries */
    ut32 ilocalsym;           /* index into symbols for local symbols */
    ut32 nlocalsym;           /* number of local symbols */

    ut32 iextrel;       /* index into external relocation entries */
    ut32 nextrel;       /* number of external relocation entries */

    ut32 iinit_iterm;   /* low 16 bits are the index into the init
                           section, high 16 bits are the index into
                             the term section */
    ut32 ninit_nterm;   /* low 16 bits are the number of init section
                           entries, high 16 bits are the number of
                           term section entries */

    ut32                /* for this module address of the start of */
      objc_module_info_addr;  /*  the (__OBJC,__module_info) section */
    ut32                /* for this module size of */
      objc_module_info_size;  /*  the (__OBJC,__module_info) section */
};    

/* a 64-bit module table entry */
01334 struct dylib_module_64 {
    ut32 module_name;   /* the module name (index into string table) */

    ut32 iextdefsym;    /* index into externally defined symbols */
    ut32 nextdefsym;    /* number of externally defined symbols */
    ut32 irefsym;       /* index into reference symbol table */
    ut32 nrefsym;       /* number of reference symbol table entries */
    ut32 ilocalsym;           /* index into symbols for local symbols */
    ut32 nlocalsym;           /* number of local symbols */

    ut32 iextrel;       /* index into external relocation entries */
    ut32 nextrel;       /* number of external relocation entries */

    ut32 iinit_iterm;   /* low 16 bits are the index into the init
                           section, high 16 bits are the index into
                           the term section */
    ut32 ninit_nterm;      /* low 16 bits are the number of init section
                          entries, high 16 bits are the number of
                          term section entries */

    ut32                /* for this module size of */
        objc_module_info_size;      /*  the (__OBJC,__module_info) section */
    ut64                /* for this module address of the start of */
        objc_module_info_addr;      /*  the (__OBJC,__module_info) section */
};

/* 
 * The entries in the reference symbol table are used when loading the module
 * (both by the static and dynamic link editors) and if the module is unloaded
 * or replaced.  Therefore all external symbols (defined and undefined) are
 * listed in the module's reference table.  The flags describe the type of
 * reference that is being made.  The constants for the flags are defined in
 * <mach-o/nlist.h> as they are also used for symbol table entries.
 */
01368 struct dylib_reference {
    ut32 isym:24,       /* index into the symbol table */
              flags:8;  /* flags to indicate the type of reference */
};

/*
 * The twolevel_hints_command contains the offset and number of hints in the
 * two-level namespace lookup hints table.
 */
01377 struct twolevel_hints_command {
    ut32 cmd;     /* LC_TWOLEVEL_HINTS */
    ut32 cmdsize; /* sizeof(struct twolevel_hints_command) */
    ut32 offset;  /* offset to the hint table */
    ut32 nhints;  /* number of hints in the hint table */
};

/*
 * The entries in the two-level namespace lookup hints table are twolevel_hint
 * structs.  These provide hints to the dynamic link editor where to start
 * looking for an undefined symbol in a two-level namespace image.  The
 * isub_image field is an index into the sub-images (sub-frameworks and
 * sub-umbrellas list) that made up the two-level image that the undefined
 * symbol was found in when it was built by the static link editor.  If
 * isub-image is 0 the the symbol is expected to be defined in library and not
 * in the sub-images.  If isub-image is non-zero it is an index into the array
 * of sub-images for the umbrella with the first index in the sub-images being
 * 1. The array of sub-images is the ordered list of sub-images of the umbrella
 * that would be searched for a symbol that has the umbrella recorded as its
 * primary library.  The table of contents index is an index into the
 * library's table of contents.  This is used as the starting point of the
 * binary search or a directed linear search.
 */
01400 struct twolevel_hint {
    ut32 
      isub_image:8,     /* index into the sub images */
      itoc:24;    /* index into the table of contents */
};

/*
 * The prebind_cksum_command contains the value of the original check sum for
 * prebound files or zero.  When a prebound file is first created or modified
 * for other than updating its prebinding information the value of the check sum
 * is set to zero.  When the file has it prebinding re-done and if the value of
 * the check sum is zero the original check sum is calculated and stored in
 * cksum field of this load command in the output file.  If when the prebinding
 * is re-done and the cksum field is non-zero it is left unchanged from the
 * input file.
 */
01416 struct prebind_cksum_command {
    ut32 cmd;     /* LC_PREBIND_CKSUM */
    ut32 cmdsize; /* sizeof(struct prebind_cksum_command) */
    ut32 cksum;   /* the check sum or zero */
};

/*
 * The uuid load command contains a single 128-bit unique random number that
 * identifies an object produced by the static link editor.
 */
01426 struct uuid_command {
    ut32    cmd;        /* LC_UUID */
    ut32    cmdsize;    /* sizeof(struct uuid_command) */
    ut8     uuid[16];   /* the 128-bit uuid */
};

/*
 * The symseg_command contains the offset and size of the GNU style
 * symbol table information as described in the header file <symseg.h>.
 * The symbol roots of the symbol segments must also be aligned properly
 * in the file.  So the requirement of keeping the offsets aligned to a
 * multiple of a 4 bytes translates to the length field of the symbol
 * roots also being a multiple of a long.  Also the padding must again be
 * zeroed. (THIS IS OBSOLETE and no longer supported).
 */
01441 struct symseg_command {
      ut32  cmd;        /* LC_SYMSEG */
      ut32  cmdsize;    /* sizeof(struct symseg_command) */
      ut32  offset;           /* symbol segment offset */
      ut32  size;       /* symbol segment size in bytes */
};

/*
 * The ident_command contains a free format string table following the
 * ident_command structure.  The strings are null terminated and the size of
 * the command is padded out with zero bytes to a multiple of 4 bytes/
 * (THIS IS OBSOLETE and no longer supported).
 */
01454 struct ident_command {
      ut32 cmd;         /* LC_IDENT */
      ut32 cmdsize;     /* strings that follow this command */
};

/*
 * The fvmfile_command contains a reference to a file to be loaded at the
 * specified virtual address.  (Presently, this command is reserved for
 * internal use.  The kernel ignores this command when loading a program into
 * memory).
 */
01465 struct fvmfile_command {
      ut32 cmd;               /* LC_FVMFILE */
      ut32 cmdsize;           /* includes pathname string */
      union lc_str      name;       /* files pathname */
      ut32  header_addr;      /* files virtual address */
};

/*
 * Format of a symbol table entry of a Mach-O file for 32-bit architectures.
 * Modified from the BSD format.  The modifications from the original format
 * were changing n_other (an unused field) to n_sect and the addition of the
 * N_SECT type.  These modifications are required to support symbols in a larger
 * number of sections not just the three sections (text, data and bss) in a BSD
 * file.
 */
01480 struct nlist {
      union {
#ifndef __LP64__
            char *n_name;     /* for use when in-core */
#endif
            int32_t n_strx;   /* index into the string table */
      } n_un;
      ut8 n_type;       /* type flag, see below */
      ut8 n_sect;       /* section number or NO_SECT */
      int16_t n_desc;         /* see <mach-o/stab.h> */
      ut32 n_value;     /* value of this symbol (or stab offset) */
};

/*
 * This is the symbol table entry structure for 64-bit architectures.
 */
01496 struct nlist_64 {
      union {
            ut32  n_strx; /* index into the string table */
      } n_un;
      ut8 n_type;        /* type flag, see below */
      ut8 n_sect;        /* section number or NO_SECT */
      ut16 n_desc;       /* see <mach-o/stab.h> */
      ut64 n_value;      /* value of this symbol (or stab offset) */
};

/*
 * Symbols with a index into the string table of zero (n_un.n_strx == 0) are
 * defined to have a null, "", name.  Therefore all string indexes to non null
 * names must not have a zero string index.  This is bit historical information
 * that has never been well documented.
 */

/*
 * The n_type field really contains four fields:
 *    unsigned char N_STAB:3,
 *                N_PEXT:1,
 *                N_TYPE:3,
 *                N_EXT:1;
 * which are used via the following masks.
 */
#define     N_STAB      0xe0  /* if any of these bits set, a symbolic debugging entry */
#define     N_PEXT      0x10  /* private external symbol bit */
#define     N_TYPE      0x0e  /* mask for the type bits */
#define     N_EXT 0x01  /* external symbol bit, set for external symbols */

/*
 * Only symbolic debugging entries have some of the N_STAB bits set and if any
 * of these bits are set then it is a symbolic debugging entry (a stab).  In
 * which case then the values of the n_type field (the entire field) are given
 * in <mach-o/stab.h>
 */

/*
 * Values for N_TYPE bits of the n_type field.
 */
#define     N_UNDF      0x0         /* undefined, n_sect == NO_SECT */
#define     N_ABS 0x2         /* absolute, n_sect == NO_SECT */
#define     N_SECT      0xe         /* defined in section number n_sect */
#define     N_PBUD      0xc         /* prebound undefined (defined in a dylib) */
#define N_INDR    0xa         /* indirect */

/* 
 * If the type is N_INDR then the symbol is defined to be the same as another
 * symbol.  In this case the n_value field is an index into the string table
 * of the other symbol's name.  When the other symbol is defined then they both
 * take on the defined type and value.
 */

/*
 * If the type is N_SECT then the n_sect field contains an ordinal of the
 * section the symbol is defined in.  The sections are numbered from 1 and 
 * refer to sections in order they appear in the load commands for the file
 * they are in.  This means the same ordinal may very well refer to different
 * sections in different files.
 *
 * The n_value field for all symbol table entries (including N_STAB's) gets
 * updated by the link editor based on the value of it's n_sect field and where
 * the section n_sect references gets relocated.  If the value of the n_sect 
 * field is NO_SECT then it's n_value field is not changed by the link editor.
 */
#define     NO_SECT           0     /* symbol is not in any section */
#define MAX_SECT  255   /* 1 thru 255 inclusive */

/*
 * Common symbols are represented by undefined (N_UNDF) external (N_EXT) types
 * who's values (n_value) are non-zero.  In which case the value of the n_value
 * field is the size (in bytes) of the common symbol.  The n_sect field is set
 * to NO_SECT.
 */

/*
 * To support the lazy binding of undefined symbols in the dynamic link-editor,
 * the undefined symbols in the symbol table (the nlist structures) are marked
 * with the indication if the undefined reference is a lazy reference or
 * non-lazy reference.  If both a non-lazy reference and a lazy reference is
 * made to the same symbol the non-lazy reference takes precedence.  A reference
 * is lazy only when all references to that symbol are made through a symbol
 * pointer in a lazy symbol pointer section.
 *
 * The implementation of marking nlist structures in the symbol table for
 * undefined symbols will be to use some of the bits of the n_desc field as a
 * reference type.  The mask REFERENCE_TYPE will be applied to the n_desc field
 * of an nlist structure for an undefined symbol to determine the type of
 * undefined reference (lazy or non-lazy).
 *
 * The constants for the REFERENCE FLAGS are propagated to the reference table
 * in a shared library file.  In that case the constant for a defined symbol,
 * REFERENCE_FLAG_DEFINED, is also used.
 */
/* Reference type bits of the n_desc field of undefined symbols */
#define REFERENCE_TYPE                    0xf
/* types of references */
#define REFERENCE_FLAG_UNDEFINED_NON_LAZY       0
#define REFERENCE_FLAG_UNDEFINED_LAZY                 1
#define REFERENCE_FLAG_DEFINED                        2
#define REFERENCE_FLAG_PRIVATE_DEFINED                3
#define REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY     4
#define REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY         5

/*
 * To simplify stripping of objects that use are used with the dynamic link
 * editor, the static link editor marks the symbols defined an object that are
 * referenced by a dynamicly bound object (dynamic shared libraries, bundles).
 * With this marking strip knows not to strip these symbols.
 */
#define REFERENCED_DYNAMICALLY      0x0010

/*
 * For images created by the static link editor with the -twolevel_namespace
 * option in effect the flags field of the mach header is marked with
 * MH_TWOLEVEL.  And the binding of the undefined references of the image are
 * determined by the static link editor.  Which library an undefined symbol is
 * bound to is recorded by the static linker in the high 8 bits of the n_desc
 * field using the SET_LIBRARY_ORDINAL macro below.  The ordinal recorded
 * references the libraries listed in the Mach-O's LC_LOAD_DYLIB load commands
 * in the order they appear in the headers.   The library ordinals start from 1.
 * For a dynamic library that is built as a two-level namespace image the
 * undefined references from module defined in another use the same nlist struct
 * an in that case SELF_LIBRARY_ORDINAL is used as the library ordinal.  For
 * defined symbols in all images they also must have the library ordinal set to
 * SELF_LIBRARY_ORDINAL.  The EXECUTABLE_ORDINAL refers to the executable
 * image for references from plugins that refer to the executable that loads
 * them.
 * 
 * The DYNAMIC_LOOKUP_ORDINAL is for undefined symbols in a two-level namespace
 * image that are looked up by the dynamic linker with flat namespace semantics.
 * This ordinal was added as a feature in Mac OS X 10.3 by reducing the
 * value of MAX_LIBRARY_ORDINAL by one.  So it is legal for existing binaries
 * or binaries built with older tools to have 0xfe (254) dynamic libraries.  In
 * this case the ordinal value 0xfe (254) must be treated as a library ordinal
 * for compatibility. 
 */
#define GET_LIBRARY_ORDINAL(n_desc) (((n_desc) >> 8) & 0xff)
#define SET_LIBRARY_ORDINAL(n_desc,ordinal) \
      (n_desc) = (((n_desc) & 0x00ff) | (((ordinal) & 0xff) << 8))
#define SELF_LIBRARY_ORDINAL 0x0
#define MAX_LIBRARY_ORDINAL 0xfd
#define DYNAMIC_LOOKUP_ORDINAL 0xfe
#define EXECUTABLE_ORDINAL 0xff

/*
 * The bit 0x0020 of the n_desc field is used for two non-overlapping purposes
 * and has two different symbolic names, N_NO_DEAD_STRIP and N_DESC_DISCARDED.
 */

/*
 * The N_NO_DEAD_STRIP bit of the n_desc field only ever appears in a 
 * relocatable .o file (MH_OBJECT filetype). And is used to indicate to the
 * static link editor it is never to dead strip the symbol.
 */
#define N_NO_DEAD_STRIP 0x0020 /* symbol is not to be dead stripped */

/*
 * The N_DESC_DISCARDED bit of the n_desc field never appears in linked image.
 * But is used in very rare cases by the dynamic link editor to mark an in
 * memory symbol as discared and longer used for linking.
 */
#define N_DESC_DISCARDED 0x0020     /* symbol is discarded */

/*
 * The N_WEAK_REF bit of the n_desc field indicates to the dynamic linker that
 * the undefined symbol is allowed to be missing and is to have the address of
 * zero when missing.
 */
#define N_WEAK_REF      0x0040 /* symbol is weak referenced */

/*
 * The N_WEAK_DEF bit of the n_desc field indicates to the static and dynamic
 * linkers that the symbol definition is weak, allowing a non-weak symbol to
 * also be used which causes the weak definition to be discared.  Currently this
 * is only supported for symbols in coalesed sections.
 */
#define N_WEAK_DEF      0x0080 /* coalesed symbol is a weak definition */

/*
 * The N_REF_TO_WEAK bit of the n_desc field indicates to the dynamic linker
 * that the undefined symbol should be resolved using flat namespace searching.
 */
#define     N_REF_TO_WEAK     0x0080 /* reference to a weak symbol */

#ifndef __STRICT_BSD__
/*
 * The function nlist(3) from the C library.
 */
extern int nlist (const char *filename, struct nlist *list);
#endif /* __STRICT_BSD__ */

/*
 * Symbolic debugger symbols.  The comments give the conventional use for
 * 
 *    .stabs "n_name", n_type, n_sect, n_desc, n_value
 *
 * where n_type is the defined constant and not listed in the comment.  Other
 * fields not listed are zero. n_sect is the section ordinal the entry is
 * refering to.
 */
#define     N_GSYM      0x20  /* global symbol: name,,NO_SECT,type,0 */
#define     N_FNAME     0x22  /* procedure name (f77 kludge): name,,NO_SECT,0,0 */
#define     N_FUN 0x24  /* procedure: name,,n_sect,linenumber,address */
#define     N_STSYM     0x26  /* static symbol: name,,n_sect,type,address */
#define     N_LCSYM     0x28  /* .lcomm symbol: name,,n_sect,type,address */
#define N_BNSYM 0x2e    /* begin nsect sym: 0,,n_sect,0,address */
#define N_OPT     0x3c  /* emitted with gcc2_compiled and in gcc source */
#define     N_RSYM      0x40  /* register sym: name,,NO_SECT,type,register */
#define     N_SLINE     0x44  /* src line: 0,,n_sect,linenumber,address */
#define N_ENSYM 0x4e    /* end nsect sym: 0,,n_sect,0,address */
#define     N_SSYM      0x60  /* structure elt: name,,NO_SECT,type,struct_offset */
#define     N_SO  0x64  /* source file name: name,,n_sect,0,address */
#define     N_OSO 0x66  /* object file name: name,,0,0,st_mtime */
#define     N_LSYM      0x80  /* local sym: name,,NO_SECT,type,offset */
#define N_BINCL   0x82  /* include file beginning: name,,NO_SECT,0,sum */
#define     N_SOL 0x84  /* #included file name: name,,n_sect,0,address */
#define     N_PARAMS  0x86    /* compiler parameters: name,,NO_SECT,0,0 */
#define     N_VERSION 0x88    /* compiler version: name,,NO_SECT,0,0 */
#define     N_OLEVEL  0x8A    /* compiler -O level: name,,NO_SECT,0,0 */
#define     N_PSYM      0xa0  /* parameter: name,,NO_SECT,type,offset */
#define N_EINCL   0xa2  /* include file end: name,,NO_SECT,0,0 */
#define     N_ENTRY     0xa4  /* alternate entry: name,,n_sect,linenumber,address */
#define     N_LBRAC     0xc0  /* left bracket: 0,,NO_SECT,nesting level,address */
#define N_EXCL    0xc2  /* deleted include file: name,,NO_SECT,0,sum */
#define     N_RBRAC     0xe0  /* right bracket: 0,,NO_SECT,nesting level,address */
#define     N_BCOMM     0xe2  /* begin common: name,,NO_SECT,0,0 */
#define     N_ECOMM     0xe4  /* end common: name,,n_sect,0,0 */
#define     N_ECOML     0xe8  /* end common (local name): 0,,n_sect,0,address */
#define     N_LENG      0xfe  /* second stab entry with length information */

/*
 * for the berkeley pascal compiler, pc(1):
 */
#define     N_PC  0x30  /* global pascal symbol: name,,NO_SECT,subtype,line */

01732 struct fat_header {
      ut32 magic;
      ut32 nfat_arch;
};

01737 struct fat_arch {
      int cputype;
      int cpusubtype;
      ut32 offset;
      ut32 size;
      ut32 align;
};

/* Cache header */

01747 struct cache_header {
      char version[16];
      ut32 baseaddroff;
      ut32 unk2;
      ut32 startaddr;
      ut32 numlibs;

      ut64 dyldaddr;
      //ut64 codesignoff;
};

#define LC_DYLD_INFO      0x22
#define LC_DYLD_INFO_ONLY 0x80000022
01760 struct dyld_info_32 {
      ut32 cmd;
      ut32 cmdsize;
      ut32 rebase_off;
      ut32 rebase_size;
      ut32 bind_off;
      ut32 bind_size;
      ut32 weak_bind_off;
      ut32 weak_bind_size;
      ut32 lazy_bind_off;
      ut32 lazy_bind_size;
      ut32 export_off;
      ut32 export_size;
};

#endif /* _MACHO_LOADER_H_ */

Generated by  Doxygen 1.6.0   Back to index