Changeset 2951


Ignore:
Timestamp:
Jan 29, 2007, 3:10:52 AM (19 years ago)
Author:
bird
Message:

The command structures essential to MH_OBJECT.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrModMachO.h

    r2950 r2951  
    312312#define LC_SUB_FRAMEWORK    UINT32_C(0x12)  /**< Sub framework. See sub_framework_command. */
    313313#define LC_SUB_UMBRELLA     UINT32_C(0x13)  /**< Sub umbrella. See sub_umbrella_command. */
    314 #define LC_SUB_CLIENT       UINT32_C(0x14)  /**< Sub client. See sub_client_command.
     314#define LC_SUB_CLIENT       UINT32_C(0x14)  /**< Sub client. See sub_client_command. */
    315315#define LC_SUB_LIBRARY      UINT32_C(0x15)  /**< Sub library. See sub_library_command. */
    316316#define LC_TWOLEVEL_HINTS   UINT32_C(0x16)  /**< Two-level namespace lookup hints. See twolevel_hints_command. */
     
    322322/** @} */
    323323
     324
     325/**
     326 * Load Command String.
     327 */
     328typedef struct lc_str
     329{
     330    /** Offset of the string relative to the load_command structure.
     331     * The string is zero-terminated. the size of the load command
     332     * is zero padded up to a multiple of 4 bytes. */
     333    uint32_t        offset;
     334} lc_str_t;
     335
     336
     337/**
     338 * Segment load command (32-bit).
     339 */
     340typedef struct segment_command_32
     341{
     342    uint32_t        cmd;            /**< LC_SEGMENT */
     343    uint32_t        cmdsize;        /**< sizeof(self) + sections. */
     344    char            segname[16];    /**< The segment name. */
     345    uint32_t        vmaddr;         /**< Memory address of this segment. */
     346    uint32_t        vmsize;         /**< Size of this segment. */
     347    uint32_t        fileoff;        /**< The file location of the segment. */
     348    uint32_t        filesize;       /**< The file size of the segment. */
     349    uint32_t        maxprot;        /**< Maximum VM protection. */
     350    uint32_t        initprot;       /**< Initial VM protection. */
     351    uint32_t        nsects;         /**< Number of section desciptors following this structure. */
     352    uint32_t        flags;          /**< Flags (SG_*). */
     353} segment_command_32_t;
     354
     355
     356/**
     357 * Segment load command (64-bit).
     358 * Same as segment_command_32 except 4 members has been blown up to 64-bit.
     359 */
     360typedef struct segment_command_64
     361{
     362    uint32_t        cmd;            /**< LC_SEGMENT */
     363    uint32_t        cmdsize;        /**< sizeof(self) + sections. */
     364    char            segname[16];    /**< The segment name. */
     365    uint64_t        vmaddr;         /**< Memory address of this segment. */
     366    uint64_t        vmsize;         /**< Size of this segment. */
     367    uint64_t        fileoff;        /**< The file location of the segment. */
     368    uint64_t        filesize;       /**< The file size of the segment. */
     369    uint32_t        maxprot;        /**< Maximum VM protection. */
     370    uint32_t        initprot;       /**< Initial VM protection. */
     371    uint32_t        nsects;         /**< Number of section desciptors following this structure. */
     372    uint32_t        flags;          /**< Flags (SG_*). */
     373} segment_command_64_t;
     374
     375/** @name Segment flags (segment_command_64::flags, segment_command_32::flags)
     376 * @{ */
     377/** Map the file bits in the top end of the memory area for the segment
     378 * instead of the low end. Intended for stacks in core dumps.
     379 * The part of the segment memory not covered by file bits will be zeroed. */
     380#define SG_HIGHVM           UINT32_C(0x00000001)
     381/** This segment is the virtual memory allocated by a fixed VM library.
     382 * (Used for overlap checking in the linker.) */
     383#define SG_FVMLIB           UINT32_C(0x00000002)
     384/** No relocations for or symbols that's relocated to in this segment.
     385 * The segment can therefore safely be replaced. */
     386#define SG_NORELOC          UINT32_C(0x00000004)
     387/** The segment is protected.
     388 * The first page isn't protected if it starts at file offset 0
     389 * (so that the mach header and this load command can be easily mapped). */
     390#define SG_PROTECTED_VERSION_1 UINT32_C(0x00000008)
     391/** @} */
     392
     393
     394/**
     395 * 32-bit section (part of a segment load command).
     396 */
     397typedef struct section_32
     398{
     399    char            sectname[16];   /**< The section name. */
     400    char            segname[16];    /**< The name of the segment this section goes into. */
     401    uint32_t        addr;           /**< The memory address of this section. */
     402    uint32_t        size;           /**< The size of this section. */
     403    uint32_t        offset;         /**< The file offset of this section. */
     404    uint32_t        align;          /**< The section alignment (**2). */
     405    uint32_t        reloff;         /**< The file offset of the relocations. */
     406    uint32_t        nreloc;         /**< The number of relocations. */
     407    uint32_t        flags;          /**< The section flags; section type and attribs */
     408    uint32_t        reserved1;      /**< Reserved / offset / index. */
     409    uint32_t        reserved2;      /**< Reserved / count / sizeof. */
     410} section_32_t;
     411
     412/**
     413 * 64-bit section (part of a segment load command).
     414 */
     415typedef struct section_64
     416{
     417    char            sectname[16];   /**< The section name. */
     418    char            segname[16];    /**< The name of the segment this section goes into. */
     419    uint64_t        addr;           /**< The memory address of this section. */
     420    uint64_t        size;           /**< The size of this section. */
     421    uint32_t        offset;         /**< The file offset of this section. */
     422    uint32_t        align;          /**< The section alignment (**2). */
     423    uint32_t        reloff;         /**< The file offset of the relocations. */
     424    uint32_t        nreloc;         /**< The number of relocations. */
     425    uint32_t        flags;          /**< The section flags; section type and attribs */
     426    uint32_t        reserved1;      /**< Reserved / offset / index. */
     427    uint32_t        reserved2;      /**< Reserved / count / sizeof. */
     428    uint32_t        reserved3;      /**< (Just) Reserved. */
     429} section_64_t;
     430
     431/** @name Section flags (section_64::flags, section_32::flags)
     432 * @{
     433 */
     434/** Section type mask. */
     435#define SECTION_TYPE                UINT32_C(0x000000ff)
     436/** Regular section. */
     437#define S_REGULAR                   0x0
     438/** Zero filled section. */
     439#define S_ZEROFILL                  0x1
     440/** C literals. */
     441#define S_CSTRING_LITERALS          0x2
     442/** 4 byte literals. */
     443#define S_4BYTE_LITERALS            0x3
     444/** 8 byte literals. */
     445#define S_8BYTE_LITERALS            0x4
     446/** Pointer to literals. */
     447#define S_LITERAL_POINTERS          0x5
     448/** Section containing non-lazy symbol pointers.
     449 * Reserved1 == start index in the indirect symbol table. */
     450#define S_NON_LAZY_SYMBOL_POINTERS  0x6
     451/** Section containing lazy symbol pointers.
     452 * Reserved1 == start index in the indirect symbol table. */
     453#define S_LAZY_SYMBOL_POINTERS      0x7
     454/** Section containing symbol stubs.
     455 * Reserved2 == stub size. */
     456#define S_SYMBOL_STUBS              0x8
     457/** Section containing function pointers for module initialization. . */
     458#define S_MOD_INIT_FUNC_POINTERS    0x9
     459/** Section containing function pointers for module termination. . */
     460#define S_MOD_TERM_FUNC_POINTERS    0xa
     461/** Section containing symbols that are to be coalesced. */
     462#define S_COALESCED                 0xb
     463/** Zero filled section that be larger than 4GB. */
     464#define S_GB_ZEROFILL               0xc
     465/** Section containing pairs of function pointers for interposing. */
     466#define S_INTERPOSING               0xd
     467/** 16 byte literals. */
     468#define S_16BYTE_LITERALS           0xe
     469
     470/** Section attribute mask. */
     471#define SECTION_ATTRIBUTES          UINT32_C(0xffffff00)
     472
     473/** User settable attribute mask. */
     474#define SECTION_ATTRIBUTES_USR      UINT32_C(0xff000000)
     475/** Pure instruction (code). */
     476#define S_ATTR_PURE_INSTRUCTIONS    UINT32_C(0x80000000)
     477/** ranlib, ignore my symbols... */
     478#define S_ATTR_NO_TOC               UINT32_C(0x40000000)
     479/** May strip static symbols when linking int a MH_DYLDLINK file. */
     480#define S_ATTR_STRIP_STATIC_SYMS    UINT32_C(0x20000000)
     481/** No dead stripping. */
     482#define S_ATTR_NO_DEAD_STRIP        UINT32_C(0x10000000)
     483/** Live support. */
     484#define S_ATTR_LIVE_SUPPORT         UINT32_C(0x08000000)
     485/** Contains self modifying code (generally i386 code stub for dyld). */
     486#define S_ATTR_SELF_MODIFYING_CODE  UINT32_C(0x04000000)
     487/** Debug info (DWARF usually). */
     488#define S_ATTR_DEBUG                UINT32_C(0x02000000)
     489
     490/** System settable attribute mask. */
     491#define SECTION_ATTRIBUTES_SYS      UINT32_C(0x00ffff00)
     492/** Contains some instructions (code). */
     493#define S_ATTR_SOME_INSTRUCTIONS    UINT32_C(0x00000400)
     494/** Has external relocations. */
     495#define S_ATTR_EXT_RELOC            UINT32_C(0x00000200)
     496/** Has internal (local) relocations. */
     497#define S_ATTR_LOC_RELOC            UINT32_C(0x00000100)
     498/** @} */
     499
     500/** @name Known Segment and Section Names.
     501 * Some of these implies special linker behaviour.
     502 * @{
     503 */
     504/** Page zero - not-present page for catching invalid access. (MH_EXECUTE typically) */
     505#define SEG_PAGEZERO        "__PAGEZERO"
     506/** Traditional UNIX text segment.
     507 * Defaults to R-X. */
     508#define SEG_TEXT            "__TEXT"
     509/** The text part of SEG_TEXT. */
     510#define SECT_TEXT               "__text"
     511/** The fvmlib initialization. */
     512#define SECT_FVMLIB_INIT0       "__fvmlib_init0"
     513/** The section following the fvmlib initialization. */
     514#define SECT_FVMLIB_INIT1       "__fvmlib_init1"
     515/** The traditional UNIX data segment. (DGROUP to DOS and OS/2 people.) */
     516#define SEG_DATA            "__DATA"
     517/** The initialized data section. */
     518#define SECT_DATA               "__data"
     519/** The uninitialized data section. */
     520#define SECT_BSS                "__bss"
     521/** The common symbol section. */
     522#define SECT_COMMON             "__common"
     523/** Objective-C runtime segment. */
     524#define SEG_OBJC            "__OBJC"
     525/** Objective-C symbol table section. */
     526#define SECT_OBJC_SYMBOLS       "__symbol_table"
     527/** Objective-C module information section. */
     528#define SECT_OBJC_MODULES       "__module_info"
     529/** Objective-C string table section. */
     530#define SECT_OBJC_STRINGS       "__selector_strs"
     531/** Objective-C string table section. */
     532#define SECT_OBJC_REFS          "__selector_refs"
     533/** Icon segment. */
     534#define SEG_ICON            "__ICON"
     535/** The icon headers. */
     536#define SECT_ICON_HEADER        "__header"
     537/** The icons in the TIFF format. */
     538#define SECT_ICON_TIFF          "__tiff"
     539/** ld -seglinkedit segment containing all the structs create and maintained
     540 * by the linker. MH_EXECUTE and MH_FVMLIB only. */
     541#define SEG_LINKEDIT        "__LINKEDIT"
     542/** The unix stack segment. */
     543#define SEG_UNIXSTACK       "__UNIXSTACK"
     544/** The segment for the self modifying code for dynamic linking.
     545 * Implies RWX permissions. */
     546#define SEG_IMPORT          "__IMPORT"
     547/** @} */
     548
     549
     550/** @todo fvmlib */
     551/** @todo fvmlib_command (LC_IDFVMLIB or LC_LOADFVMLIB) */
     552/** @todo dylib */
     553/** @todo dylib_command (LC_ID_DYLIB, LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB) */
     554/** @todo sub_framework_command (LC_SUB_FRAMEWORK) */
     555/** @todo sub_client_command (LC_SUB_CLIENT) */
     556/** @todo sub_umbrella_command (LC_SUB_UMBRELLA) */
     557/** @todo sub_library_command (LC_SUB_LIBRARY) */
     558/** @todo prebound_dylib_command (LC_PREBOUND_DYLIB) */
     559/** @todo dylinker_command (LC_ID_DYLINKER or LC_LOAD_DYLINKER) */
     560
     561
     562/**
     563 * Thread command.
     564 *
     565 * State description of a thread that is to be created. The description
     566 * is made up of a number of state structures preceded by a 32-bit flavor
     567 * and 32-bit count field stating the kind of stat structure and it's size
     568 * in uint32_t items respecitvly.
     569 *
     570 * LC_UNIXTHREAD differs from LC_THREAD in that it implies stack creation
     571 * and that it's started with the typical main(int, char **, char **) frame
     572 * on the stack.
     573 */
     574typedef struct thread_command
     575{
     576    uint32_t        cmd;        /**< LC_UNIXTHREAD or LC_THREAD. */
     577    uint32_t        cmdsize;    /**< The size of the command (including this header). */
     578} thread_command_t;
     579
     580
     581/** @todo routines_command (LC_ROUTINES) */
     582/** @todo routines_command_64 (LC_ROUTINES_64) */
     583
     584
     585/**
     586 * Symbol table command.
     587 * Contains a.out style symbol table with some tricks.
     588 */
     589typedef struct symtab_command
     590{
     591    uint32_t        cmd;        /**< LC_SYMTAB */
     592    uint32_t        cmdsize;    /** sizeof(symtab_command_t) */
     593    uint32_t        symoff;     /** The file offset of the symbol table. */
     594    uint32_t        nsyms;      /** The number of symbols in the symbol table. */
     595    uint32_t        stroff;     /** The file offset of the string table. */
     596    uint32_t        strsize;    /** The size of the string table. */
     597} symtab_command_t;
     598
     599
     600/** @todo dysymtab_command (LC_DYSYMTAB)  */
     601/** @todo dylib_table_of_contents */
     602/** @todo dylib_module_32 */
     603/** @todo dylib_module_64 */
     604/** @todo dylib_reference */
     605/** @todo twolevel_hints_command (LC_TWOLEVEL_HINTS) */
     606/** @todo twolevel_hint */
     607/** @todo prebind_cksum_command (LC_PREBIND_CKSUM) */
     608
     609
     610/**
     611 * UUID generated by ld.
     612 */
     613typedef struct uuid_command
     614{
     615    uint32_t        cmd;        /**< LC_UUID */
     616    uint32_t        cmdsize;    /**< sizeof(uuid_command_t) */
     617    uint8_t         uuid[16];   /** The UUID bytes. */
     618} uuid_command_t;
     619
     620
     621/** @todo symseg_command (LC_SYMSEG) */
     622/** @todo ident_command (LC_IDENT)
     623/** @todo fvmfile_command (LC_FVMFILE) */
    324624#endif
    325625
Note: See TracChangeset for help on using the changeset viewer.