Expand description
Mach-O definitions.
These definitions are independent of read/write support, although we do implement some traits useful for those.
This module is based heavily on header files from MacOSX11.1.sdk.
Structs
- The dyld cache header. Corresponds to struct dyld_cache_header from dyld_cache_format.h. This header has grown over time. Only the fields up to and including dyld_base_address are guaranteed to be present. For all other fields, check the header size before accessing the field. The header size is stored in mapping_offset; the mappings start right after the theader.
- Corresponds to struct dyld_cache_image_info from dyld_cache_format.h.
- Corresponds to struct dyld_cache_mapping_info from dyld_cache_format.h.
- Corresponds to a struct whose source code has not been published as of Nov 2021. Added in the dyld cache version which shipped with macOS 12 / iOS 15.
- A variable length string in a load command.
- Common fields at the start of every load command.
- The 32-bit mach header.
- The 64-bit mach header.
- A relocation entry.
- 32-bit section.
- 64-bit section.
- 32-bit segment load command.
- 64-bit segment load command.
Constants
- must be followed by PAGE21 or PAGEOFF12
- a B/BL instruction with 26-bit displacement
- pc-rel distance to page of GOT slot
- offset within page of GOT slot, scaled by r_length
- pc-rel distance to page of target
- offset within page, scaled by r_length
- for pointers to GOT slots
- must be followed by a ARM64_RELOC_UNSIGNED
- pc-rel distance to page of TLVP slot
- offset within page of TLVP slot, scaled by r_length
- for pointers
- 24 bit branch displacement (to a word address)
- like ARM_RELOC_SECTDIFF, but the symbol referenced was local.
- the second relocation entry of a pair
- prebound lazy pointer
- a PAIR follows with subtract symbol value
- generic relocation as discribed above
- obsolete - a thumb 32-bit branch instruction possibly needing page-spanning branch workaround
- 22 bit branch displacement (to a half-word address)
- 64 bit ABI
- ABI for 64-bit hardware with 32-bit types; LP32
- mask for architecture bits
- When selecting a slice, ANY will pick the slice with the best grading for the selected cpu_type_t, unlike the “ALL” subtypes, which are the slices that can run on any hardware for that cpu type.
- Not meant to be run under xnu
- ARMv7-A and ARMv7-R
- Not meant to be run under xnu
- Cortex A9
- Not meant to be run under xnu
- Swift
- Not meant to be run under xnu
- 64 bit libraries
- mask for feature flags
- pmax
- 3max
- pointer authentication with versioned ABI
- Haswell feature subset
- NXSwapLong(FAT_MAGIC)
- NXSwapLong(FAT_MAGIC_64)
- Only follows a GENERIC_RELOC_SECTDIFF
- prebound lazy pointer
- thread local variables
- generic relocation as discribed above
- build for platform min OS version
- local of code signature
- table of non-instructions in __text
- used with
LinkeditDataCommand
- string for dyld to treat like environment variable
- used with
LinkeditDataCommand
, payload is trie - compressed dyld information
- compressed dyld information only
- Code signing DRs copied from linked dylibs
- dynamic link-edit symbol table info
- encrypted segment information
- 64-bit encrypted segment information
- used with
FilesetEntryCommand
- compressed table of function start addresses
- fixed VM file inclusion (internal use)
- object identification info (obsolete)
- fixed VM shared library identification
- dynamically linked shared lib ident
- dynamic linker identification
- delay load of dylib until first use
- optimization hints in MH_OBJECT files
- linker options in MH_OBJECT files
- load a specified fixed VM shared library
- load a dynamically linked shared library
- load a dynamic linker
- load upward dylib
- load a dynamically linked shared library that is allowed to be missing (all symbols are weak imported).
- replacement for LC_UNIXTHREAD
- arbitrary data included within a Mach-O file
- prebind checksum
- modules prebound for a dynamically linked shared library
- prepage command (internal use)
- load and re-export dylib
- image routines
- 64-bit image routines
- runpath additions
- segment of this file to be mapped
- 64-bit segment of this file to be mapped
- local of info to split segments
- source version used to build binary
- sub client
- sub framework
- sub library
- sub umbrella
- link-edit gdb symbol table info (obsolete)
- link-edit stab symbol table info
- thread
- two-level namespace lookup hints
- unix thread (includes a stack)
- the uuid
- build for iPhoneOS min OS version
- build for MacOSX min OS version
- build for AppleTV min OS version
- build for Watch min OS version
- 1 thru 255 inclusive
- 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.
- When this bit is set, all stacks in the task will be given stack execution privilege. Only used in MH_EXECUTE filetypes.
- The code was linked for use in an application extension.
- the object file’s undefined references are bound by the dynamic linker when loaded.
- the final linked image uses weak symbols
- dynamically bound bundle file
- the binary has been canonicalized via the unprebind operation
- NXSwapInt(MH_MAGIC)
- NXSwapInt(MH_MAGIC_64)
- core file
- 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.
- companion file with only debug sections
- the object file is input for the dynamic linker and can’t be staticly link edited again
- dynamically bound shared library
- Only for use on dylibs. When this bit is set, the dylib is part of the dyld shared cache, rather than loose in the filesystem.
- shared library stub for static linking only, no section contents
- dynamic link editor
- demand paged executable file
- set of mach-o’s
- the executable is forcing all images to use flat name space bindings
- fixed VM shared library file
- Contains a section of type S_THREAD_LOCAL_VARIABLES
- the object file is the output of an incremental link against a base file and can’t be link edited again
- x86_64 kexts
- the shared library init routine is to be run lazily via catching memory faults to its writeable segments (obsolete)
- the mach magic number
- the 64-bit mach magic number
- The external symbols listed in the nlist symbol table do not include all the symbols listed in the dyld info.
- do not have dyld notify the prebinding agent about this executable
- this umbrella guarantees no multiple defintions of symbols in its sub-images so the two-level namespace hints can always be used.
- the object file has no undefined references
- 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.
- When this bit is set on a dylib, the static linker does not need to examine dependent dylibs to see if any are re-exported
- relocatable object file
- When this bit is set, the OS will load the main executable at a random address. Only used in MH_EXECUTE filetypes.
- the binary is not prebound but can have its prebinding redone. only used when MH_PREBOUND is not set.
- the file has its dynamic undefined references prebound.
- preloaded executable file
- When this bit is set, the binary declares it is safe for use in processes with uid zero
- When this bit is set, the binary declares it is safe for use in processes when issetugid() is true
- Allow LC_MIN_VERSION_MACOS and LC_BUILD_VERSION load commands with the platforms macOS, iOSMac, iOSSimulator, tvOSSimulator and watchOSSimulator.
- the file has its read-only and read-write segments split
- safe to divide up the sections into sub-sections via symbols for dead code stripping
- the image is using two-level name space bindings
- the final linked image contains external weak symbols
- symbol is not in any section
- absolute, n_sect == NO_SECT
- symbol is a Thumb function (ARM)
- AST file path: name,,NO_SECT,0,0
- begin common: name,,NO_SECT,0,0
- include file beginning: name,,NO_SECT,0,sum
- begin nsect sym: 0,,n_sect,0,address
- symbol is discarded
- end common (local name): 0,,n_sect,0,address
- end common: name,,n_sect,0,0
- include file end: name,,NO_SECT,0,0
- end nsect sym: 0,,n_sect,0,address
- alternate entry: name,,n_sect,linenumber,address
- deleted include file: name,,NO_SECT,0,sum
- external symbol bit, set for external symbols
- procedure name (f77 kludge): name,,NO_SECT,0,0
- procedure: name,,n_sect,linenumber,address
- global symbol: name,,NO_SECT,type,0
- indirect
- left bracket: 0,,NO_SECT,nesting level,address
- .lcomm symbol: name,,n_sect,type,address
- second stab entry with length information
- local sym: name,,NO_SECT,type,offset
- symbol is not to be dead stripped
- compiler -O level: name,,NO_SECT,0,0
- emitted with gcc2_compiled and in gcc source
- object file name: name,,0,0,st_mtime
- compiler parameters: name,,NO_SECT,0,0
- prebound undefined (defined in a dylib)
- global pascal symbol: name,,NO_SECT,subtype,line
- private external symbol bit
- parameter: name,,NO_SECT,type,offset
- right bracket: 0,,NO_SECT,nesting level,address
- reference to a weak symbol
- register sym: name,,NO_SECT,type,register
- defined in section number n_sect
- src line: 0,,n_sect,linenumber,address
- source file name: name,,n_sect,0,address
- #included file name: name,,n_sect,0,address
- structure elt: name,,NO_SECT,type,struct_offset
- if any of these bits set, a symbolic debugging entry
- static symbol: name,,n_sect,type,address
- mask for the type bits
- undefined, n_sect == NO_SECT
- compiler version: name,,NO_SECT,0,0
- coalesed symbol is a weak definition
- symbol is weak referenced
- 14 bit branch displacement (to a word address)
- 24 bit branch displacement (to a word address)
- Same as the RELOC_HI16 except the low 16 bits and the high 16 bits are added together with the low 16 bits sign extened first. This means if bit 15 of the low 16 bits is set the high 16 bits stored in the instruction will be adjusted.
- a PAIR follows with the low half
- section difference forms of above. a PAIR
- Same as the LO16 except that the low 2 bits are not stored in the instruction and are always zero. This is used in double word load/store instructions.
- a PAIR follows with the high half
- follows these with subtract symbol value
- like PPC_RELOC_SECTDIFF, but the symbol referenced was local.
- the second relocation entry of a pair
- prebound lazy pointer
- a PAIR follows with subtract symbol value
- generic relocation as discribed above
- absolute relocation type for Mach-O files
- Bit set in
Relocation::r_word0
for scattered relocations. - 24 section attributes
- system setable attributes
- User setable attributes
- 256 section types
- the real uninitialized data section no padding
- the section common symbols are allocated in by the link editor
- the real initialized data section no padding, no bss overlap
- the fvmlib initialization section
- the section following the fvmlib initialization section
- the icon headers
- the icons in tiff format
- module information
- string table
- string table
- symbol table
- the real text part of the text section no headers, and no padding
- the tradition UNIX data segment
- the icon segment
- the segment for the self (dyld) modifing code stubs that has read, write and execute permissions
- 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
- the segment overlapping with linkedit containing linking information
- objective-C runtime segment
- the pagezero segment which has no protections and catches NULL references for MH_EXECUTE files
- the tradition UNIX text segment
- the unix stack segment
- this segment is the VM that is allocated by a fixed VM library, for overlap checking in the link editor
- 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)
- this segment has nothing that was relocated in it and nothing relocated to it, that is it maybe safely replaced without relocation
- 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.
- This segment is made read-only after fixups
- section with only 4 byte literals
- section with only 8 byte literals
- section with only 16 byte literals
- a debug section
- section has external relocation entries
- blocks are live if they reference live blocks
- section has local relocation entries
- no dead stripping
- section contains coalesced symbols that are not to be in a ranlib table of contents
- section contains only true machine instructions
- Used with i386 code stubs written on by dyld
- section contains some machine instructions
- ok to strip static symbols in this section in files with the MH_DYLDLINK flag
- section contains symbols that are to be coalesced
- section with only literal C strings
- section contains DTrace Object Format
- zero fill on demand section (that can be larger than 4 gigabytes)
- 32-bit offsets to initializers
- section with only pairs of function pointers for interposing
- section with only lazy symbol pointers to lazy loaded dylibs
- section with only lazy symbol pointers
- section with only pointers to literals
- section with only function pointers for initialization
- section with only function pointers for termination
- section with only non-lazy symbol pointers
- regular section
- section with only symbol stubs, byte size of stub in the reserved2 field
- functions to call to initialize TLV values
- template of initial values for TLVs
- TLV descriptors
- pointers to TLV descriptors
- template of initial values for TLVs
- zero fill on demand section
- execute permission
- read permission
- write permission
- a CALL/JMP instruction with 32-bit displacement
- other GOT references
- a MOVQ load of a GOT entry
- for signed 32-bit displacement
- for signed 32-bit displacement with a -1 addend
- for signed 32-bit displacement with a -2 addend
- for signed 32-bit displacement with a -4 addend
- must be followed by a X86_64_RELOC_UNSIGNED
- for thread local variables
- for absolute addresses