]> git.saurik.com Git - apple/xnu.git/blobdiff - EXTERNAL_HEADERS/mach-o/loader.h
xnu-2782.40.9.tar.gz
[apple/xnu.git] / EXTERNAL_HEADERS / mach-o / loader.h
index b00ac7a672ffcf48f0b5c7c1e315500be3b26006..d26ad14e3d80ff807d4b1d052c9f85b07577d36b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999-2008 Apple Inc.  All Rights Reserved.
+ * Copyright (c) 1999-2010 Apple Inc.  All Rights Reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -174,13 +174,6 @@ struct mach_header_64 {
                                           in the task will be given stack
                                           execution privilege.  Only used in
                                           MH_EXECUTE filetypes. */
-#define        MH_DEAD_STRIPPABLE_DYLIB 0x400000 /* Only for use on dylibs.  When
-                                            linking against a dylib that
-                                            has this bit set, the static linker
-                                            will automatically not create a
-                                            LC_LOAD_DYLIB load command to the
-                                            dylib if no symbols are being
-                                            referenced from the dylib. */
 #define MH_ROOT_SAFE 0x40000           /* When this bit is set, the binary 
                                          declares it is safe for use in
                                          processes with uid zero */
@@ -197,6 +190,22 @@ struct mach_header_64 {
                                           load the main executable at a
                                           random address.  Only used in
                                           MH_EXECUTE filetypes. */
+#define        MH_DEAD_STRIPPABLE_DYLIB 0x400000 /* Only for use on dylibs.  When
+                                            linking against a dylib that
+                                            has this bit set, the static linker
+                                            will automatically not create a
+                                            LC_LOAD_DYLIB load command to the
+                                            dylib if no symbols are being
+                                            referenced from the dylib. */
+#define MH_HAS_TLV_DESCRIPTORS 0x800000 /* Contains a section of type 
+                                           S_THREAD_LOCAL_VARIABLES */
+
+#define MH_NO_HEAP_EXECUTION 0x1000000 /* When this bit is set, the OS will
+                                          run the main executable with
+                                          a non-executable heap even on
+                                          platforms (e.g. i386) that don't
+                                          require it. Only used in MH_EXECUTE
+                                          filetypes. */
 
 /*
  * The load commands directly follow the mach_header.  The total size of all
@@ -275,6 +284,18 @@ struct load_command {
 #define        LC_ENCRYPTION_INFO 0x21 /* encrypted segment information */
 #define        LC_DYLD_INFO    0x22    /* compressed dyld information */
 #define        LC_DYLD_INFO_ONLY (0x22|LC_REQ_DYLD)    /* compressed dyld information only */
+#define        LC_LOAD_UPWARD_DYLIB (0x23 | LC_REQ_DYLD) /* load upward dylib */
+#define LC_VERSION_MIN_MACOSX 0x24   /* build for MacOSX min OS version */
+#define LC_VERSION_MIN_IPHONEOS 0x25 /* build for iPhoneOS min OS version */
+#define LC_FUNCTION_STARTS 0x26 /* compressed table of function start addresses */
+#define LC_DYLD_ENVIRONMENT 0x27 /* string for dyld to treat
+                                   like environment variable */
+#define LC_MAIN (0x28|LC_REQ_DYLD) /* replacement for LC_UNIXTHREAD */
+#define LC_DATA_IN_CODE 0x29 /* table of non-instructions in __text */
+#define LC_SOURCE_VERSION 0x2A /* source version used to build binary */
+#define LC_DYLIB_CODE_SIGN_DRS 0x2B /* Code signing DRs copied from linked dylibs */
+#define        LC_ENCRYPTION_INFO_64 0x2C /* 64-bit encrypted segment information */
+
 
 /*
  * A variable length string in a load command is represented by an lc_str
@@ -464,6 +485,20 @@ struct section_64 { /* for 64-bit architectures */
 #define        S_LAZY_DYLIB_SYMBOL_POINTERS    0x10    /* section with only lazy
                                                   symbol pointers to lazy
                                                   loaded dylibs */
+/*
+ * Section types to support thread local variables
+ */
+#define S_THREAD_LOCAL_REGULAR                   0x11  /* template of initial 
+                                                         values for TLVs */
+#define S_THREAD_LOCAL_ZEROFILL                  0x12  /* template of initial 
+                                                         values for TLVs */
+#define S_THREAD_LOCAL_VARIABLES                 0x13  /* TLV descriptors */
+#define S_THREAD_LOCAL_VARIABLE_POINTERS         0x14  /* pointers to TLV 
+                                                          descriptors */
+#define S_THREAD_LOCAL_INIT_FUNCTION_POINTERS    0x15  /* functions to call
+                                                         to initialize TLV
+                                                         values */
+
 /*
  * Constants for the section attributes part of the flags field of a section
  * structure.
@@ -710,9 +745,12 @@ struct prebound_dylib_command {
  * 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.
+ * This struct is also used for the LC_DYLD_ENVIRONMENT load command and
+ * contains string for dyld to treat like environment variable.
  */
 struct dylinker_command {
-       uint32_t        cmd;            /* LC_ID_DYLINKER or LC_LOAD_DYLINKER */
+       uint32_t        cmd;            /* LC_ID_DYLINKER, LC_LOAD_DYLINKER or
+                                          LC_DYLD_ENVIRONMENT */
        uint32_t        cmdsize;        /* includes pathname string */
        union lc_str    name;           /* dynamic linker's path name */
 };
@@ -1116,7 +1154,9 @@ struct rpath_command {
  * of data in the __LINKEDIT segment.  
  */
 struct linkedit_data_command {
-    uint32_t   cmd;            /* LC_CODE_SIGNATURE or LC_SEGMENT_SPLIT_INFO */
+    uint32_t   cmd;            /* LC_CODE_SIGNATURE, LC_SEGMENT_SPLIT_INFO,
+                                   LC_FUNCTION_STARTS, LC_DATA_IN_CODE,
+                                  or LC_DYLIB_CODE_SIGN_DRS */
     uint32_t   cmdsize;        /* sizeof(struct linkedit_data_command) */
     uint32_t   dataoff;        /* file offset of data in __LINKEDIT segment */
     uint32_t   datasize;       /* file size of data in __LINKEDIT segment  */
@@ -1135,6 +1175,33 @@ struct encryption_info_command {
                                   0 means not-encrypted yet */
 };
 
+/*
+ * The encryption_info_command_64 contains the file offset and size of an
+ * of an encrypted segment (for use in 64-bit targets).
+ */
+struct encryption_info_command_64 {
+   uint32_t    cmd;            /* LC_ENCRYPTION_INFO_64 */
+   uint32_t    cmdsize;        /* sizeof(struct encryption_info_command_64) */
+   uint32_t    cryptoff;       /* file offset of encrypted range */
+   uint32_t    cryptsize;      /* file size of encrypted range */
+   uint32_t    cryptid;        /* which enryption system,
+                                  0 means not-encrypted yet */
+   uint32_t    pad;            /* padding to make this struct's size a multiple
+                                  of 8 bytes */
+};
+
+/*
+ * The version_min_command contains the min OS version on which this 
+ * binary was built to run.
+ */
+struct version_min_command {
+    uint32_t   cmd;            /* LC_VERSION_MIN_MACOSX or
+                                  LC_VERSION_MIN_IPHONEOS  */
+    uint32_t   cmdsize;        /* sizeof(struct min_version_command) */
+    uint32_t   version;        /* X.Y.Z is encoded in nibbles xxxx.yy.zz */
+    uint32_t   sdk;            /* X.Y.Z is encoded in nibbles xxxx.yy.zz */
+};
+
 /*
  * The dyld_info_command contains the file offsets and sizes of 
  * the new compressed form of the information dyld needs to 
@@ -1164,7 +1231,7 @@ struct dyld_info_command {
     /*
      * Dyld binds an image during the loading process, if the image
      * requires any pointers to be initialized to symbols in other images.  
-     * The rebase information is a stream of byte sized 
+     * The bind information is a stream of byte sized 
      * opcodes whose symbolic names start with BIND_OPCODE_.
      * Conceptually the bind information is a table of tuples:
      *    <seg-index, seg-offset, type, symbol-library-ordinal, symbol-name, addend>
@@ -1217,19 +1284,27 @@ struct dyld_info_command {
      * The export area is a stream of nodes.  The first node sequentially
      * is the start node for the trie.  
      *
-     * Nodes for a symbol start with a byte that is the length of
+     * Nodes for a symbol start with a uleb128 that is the length of
      * the exported symbol information for the string so far.
-     * If there is no exported symbol, the byte is zero. If there
-     * is exported info, it follows the length byte.  The exported
-     * info normally consists of a flags and offset both encoded
-     * in uleb128.  The offset is location of the content named
-     * by the symbol.  It is the offset from the mach_header for
-     * the image.  
+     * If there is no exported symbol, the node starts with a zero byte. 
+     * If there is exported info, it follows the length.  
+        *
+        * First is a uleb128 containing flags. Normally, it is followed by
+     * a uleb128 encoded offset which is location of the content named
+     * by the symbol from the mach_header for the image.  If the flags
+     * is EXPORT_SYMBOL_FLAGS_REEXPORT, then following the flags is
+     * a uleb128 encoded library ordinal, then a zero terminated
+     * UTF8 string.  If the string is zero length, then the symbol
+     * is re-export from the specified dylib with the same name.
+        * If the flags is EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER, then following
+        * the flags is two uleb128s: the stub offset and the resolver offset.
+        * The stub is used by non-lazy pointers.  The resolver is used
+        * by lazy pointers and must be called to get the actual address to use.
      *
-     * After the initial byte and optional exported symbol information
-     * is a byte of how many edges (0-255) that this node has leaving
-     * it, followed by each edge.
-     * Each edge is a zero terminated cstring of the addition chars
+     * After the optional exported symbol information is a byte of
+     * how many edges (0-255) that this node has leaving it, 
+     * followed by each edge.
+     * Each edge is a zero terminated UTF8 of the addition chars
      * in the symbol, followed by a uleb128 offset for the node that
      * edge points to.
      *  
@@ -1297,8 +1372,8 @@ struct dyld_info_command {
 #define EXPORT_SYMBOL_FLAGS_KIND_REGULAR                       0x00
 #define EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL                  0x01
 #define EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION                    0x04
-#define EXPORT_SYMBOL_FLAGS_INDIRECT_DEFINITION                        0x08
-#define EXPORT_SYMBOL_FLAGS_HAS_SPECIALIZATIONS                        0x10
+#define EXPORT_SYMBOL_FLAGS_REEXPORT                           0x08
+#define EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER                  0x10
 
 /*
  * The symseg_command contains the offset and size of the GNU style
@@ -1340,4 +1415,59 @@ struct fvmfile_command {
        uint32_t        header_addr;    /* files virtual address */
 };
 
+
+/*
+ * The entry_point_command is a replacement for thread_command.
+ * It is used for main executables to specify the location (file offset)
+ * of main().  If -stack_size was used at link time, the stacksize
+ * field will contain the stack size need for the main thread.
+ */
+struct entry_point_command {
+    uint32_t  cmd;     /* LC_MAIN only used in MH_EXECUTE filetypes */
+    uint32_t  cmdsize; /* 24 */
+    uint64_t  entryoff;        /* file (__TEXT) offset of main() */
+    uint64_t  stacksize;/* if not zero, initial stack size */
+};
+
+
+/*
+ * The source_version_command is an optional load command containing
+ * the version of the sources used to build the binary.
+ */
+struct source_version_command {
+    uint32_t  cmd;     /* LC_SOURCE_VERSION */
+    uint32_t  cmdsize; /* 16 */
+    uint64_t  version; /* A.B.C.D.E packed as a24.b10.c10.d10.e10 */
+};
+
+
+/*
+ * The LC_DATA_IN_CODE load commands uses a linkedit_data_command 
+ * to point to an array of data_in_code_entry entries. Each entry
+ * describes a range of data in a code section.
+ */
+struct data_in_code_entry {
+    uint32_t   offset;  /* from mach_header to start of data range*/
+    uint16_t   length;  /* number of bytes in data range */
+    uint16_t   kind;    /* a DICE_KIND_* value  */
+};
+#define DICE_KIND_DATA              0x0001
+#define DICE_KIND_JUMP_TABLE8       0x0002
+#define DICE_KIND_JUMP_TABLE16      0x0003
+#define DICE_KIND_JUMP_TABLE32      0x0004
+#define DICE_KIND_ABS_JUMP_TABLE32  0x0005
+
+
+
+/*
+ * Sections of type S_THREAD_LOCAL_VARIABLES contain an array 
+ * of tlv_descriptor structures.
+ */
+struct tlv_descriptor
+{
+       void*           (*thunk)(struct tlv_descriptor*);
+       unsigned long   key;
+       unsigned long   offset;
+};
+
 #endif /* _MACHO_LOADER_H_ */