Changeset 2951
- Timestamp:
- Jan 29, 2007, 3:10:52 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrModMachO.h
r2950 r2951 312 312 #define LC_SUB_FRAMEWORK UINT32_C(0x12) /**< Sub framework. See sub_framework_command. */ 313 313 #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. */ 315 315 #define LC_SUB_LIBRARY UINT32_C(0x15) /**< Sub library. See sub_library_command. */ 316 316 #define LC_TWOLEVEL_HINTS UINT32_C(0x16) /**< Two-level namespace lookup hints. See twolevel_hints_command. */ … … 322 322 /** @} */ 323 323 324 325 /** 326 * Load Command String. 327 */ 328 typedef 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 */ 340 typedef 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 */ 360 typedef 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 */ 397 typedef 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 */ 415 typedef 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 */ 574 typedef 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 */ 589 typedef 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 */ 613 typedef 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) */ 324 624 #endif 325 625
Note:
See TracChangeset
for help on using the changeset viewer.