mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
341 lines
9.6 KiB
C
341 lines
9.6 KiB
C
#ifndef COSMOPOLITAN_LIBC_MACHO_H_
|
|
#define COSMOPOLITAN_LIBC_MACHO_H_
|
|
#ifndef __STRICT_ANSI__
|
|
|
|
/*
|
|
* xnu osfmk/mach/machine.h
|
|
*/
|
|
|
|
#define MAC_ARCH_MASK 0xff000000
|
|
#define MAC_ARCH_ABI64 0x01000000
|
|
#define MAC_ARCH_ABI64_32 0x02000000
|
|
|
|
#define MAC_CPU_MC680x0 6
|
|
#define MAC_CPU_X86 7
|
|
#define MAC_CPU_I386 MAC_CPU_X86
|
|
#define MAC_CPU_NEXGEN32E (MAC_CPU_X86 | MAC_ARCH_ABI64)
|
|
#define MAC_CPU_MC98000 10
|
|
#define MAC_CPU_HPPA 11
|
|
#define MAC_CPU_ARM 12
|
|
#define MAC_CPU_ARM64 (MAC_CPU_ARM | MAC_ARCH_ABI64)
|
|
#define MAC_CPU_ARM64_32 (MAC_CPU_ARM | MAC_ARCH_ABI64_32)
|
|
#define MAC_CPU_MC88000 13
|
|
#define MAC_CPU_SPARC 14
|
|
#define MAC_CPU_I860 15
|
|
#define MAC_CPU_POWERPC 18
|
|
#define MAC_CPU_POWERPC64 (MAC_CPU_POWERPC | MAC_ARCH_ABI64)
|
|
|
|
#define MAC_CPU_SUBTYPE_MASK 0xff000000
|
|
#define MAC_CPU_SUBTYPE_LIB64 0x80000000
|
|
#define MAC_CPU_SUBTYPE_PTRAUTH_ABI 0x80000000
|
|
#define MAC_CPU_SUBTYPE_MULTIPLE -1
|
|
#define MAC_CPU_SUBTYPE_LITTLE_ENDIAN 0
|
|
#define MAC_CPU_SUBTYPE_BIG_ENDIAN 1
|
|
|
|
#define MAC_OBJECT 0x1
|
|
#define MAC_EXECUTE 0x2
|
|
#define MAC_FVMLIB 0x3
|
|
#define MAC_CORE 0x4
|
|
#define MAC_PRELOAD 0x5
|
|
#define MAC_DYLIB 0x6
|
|
#define MAC_DYLINKER 0x7
|
|
#define MAC_BUNDLE 0x8
|
|
|
|
#define MAC_CPU_NEXGEN32E_ALL 3
|
|
|
|
#define MAC_CPU_ARM64_ALL 0
|
|
#define MAC_CPU_ARM64_V8 1
|
|
#define MAC_CPU_ARM64E 2
|
|
|
|
/*
|
|
* xnu osfmk/mach/i386/thread_status.h
|
|
*/
|
|
|
|
#define MAC_THREAD_NEXGEN32E 4 // x86_THREAD_STATE64
|
|
#define MAC_THREAD_NEXGEN32E_256BIT 17
|
|
|
|
/*
|
|
* xnu osfmk/mach/arm/thread_status.h
|
|
*
|
|
* struct arm_neon_saved_state64 {
|
|
* union {
|
|
* uint128_t q[32];
|
|
* uint64x2_t d[32];
|
|
* uint32x4_t s[32];
|
|
* } v;
|
|
* uint32_t fpsr;
|
|
* uint32_t fpcr;
|
|
* };
|
|
*/
|
|
|
|
#define MAC_THREAD_ARM_STATE64 6
|
|
#define ARM_NEON_SAVED_STATE64_COUNT 68
|
|
|
|
/*
|
|
* xnu EXTERNAL_HEADERS/mach-o/loader.h
|
|
*/
|
|
|
|
#define MAC_NOUNDEFS 0x1
|
|
#define MAC_INCRLINK 0x2
|
|
#define MAC_DYLDLINK 0x4
|
|
#define MAC_BINDATLOAD 0x8
|
|
#define MAC_PREBOUND 0x10
|
|
#define MAC_SPLIT_SEGS 0x20
|
|
#define MAC_LAZY_INIT 0x40
|
|
#define MAC_TWOLEVEL 0x80
|
|
#define MAC_FORCE_FLAT 0x100
|
|
#define MAC_NOMULTIDEFS 0x200
|
|
#define MAC_NOFIXPREBINDING 0x400
|
|
#define MAC_PREBINDABLE 0x800
|
|
#define MAC_ALLMODSBOUND 0x1000
|
|
#define MAC_SUBSECTIONS_VIA_SYMBOLS 0x2000
|
|
#define MAC_CANONICAL 0x4000
|
|
#define MAC_ALLOW_STACK_EXECUTION 0x20000
|
|
#define MAC_ROOT_SAFE 0x40000
|
|
#define MAC_SETUID_SAFE 0x80000
|
|
#define MAC_PIE 0x200000
|
|
#define MAC_HAS_TLV_DESCRIPTORS 0x800000
|
|
#define MAC_NO_HEAP_EXECUTION 0x1000000
|
|
|
|
#define MAC_SG_HIGHVM 0x1
|
|
#define MAC_SG_FVMLIB 0x2
|
|
#define MAC_SG_NORELOC 0x4
|
|
|
|
/* section type */
|
|
#define MAC_S_REGULAR 0x0
|
|
#define MAC_S_ZEROFILL 0x1
|
|
#define MAC_S_CSTRING_LITERALS 0x2
|
|
#define MAC_S_4BYTE_LITERALS 0x3
|
|
#define MAC_S_8BYTE_LITERALS 0x4
|
|
#define MAC_S_LITERAL_POINTERS 0x5
|
|
#define MAC_S_NON_LAZY_SYMBOL_POINTERS 0x6
|
|
#define MAC_S_LAZY_SYMBOL_POINTERS 0x7
|
|
#define MAC_S_SYMBOL_STUBS 0x8
|
|
#define MAC_S_MOD_INIT_FUNC_POINTERS 0x9
|
|
#define MAC_S_MOD_TERM_FUNC_POINTERS 0xa
|
|
#define MAC_S_COALESCED 0xb
|
|
#define MAC_S_GB_ZEROFILL 0xc
|
|
#define MAC_S_INTERPOSING 0xd
|
|
#define MAC_S_16BYTE_LITERALS 0xe
|
|
|
|
/* section attributes */
|
|
#define MAC_S_ATTRIBUTES_USR 0xff000000
|
|
#define MAC_S_ATTR_PURE_INSTRUCTIONS 0x80000000
|
|
#define MAC_S_ATTR_NO_TOC 0x40000000
|
|
#define MAC_S_ATTR_STRIP_STATIC_SYMS 0x20000000
|
|
#define MAC_S_ATTR_NO_DEAD_STRIP 0x10000000
|
|
#define MAC_S_ATTR_LIVE_SUPPORT 0x08000000
|
|
#define MAC_S_ATTR_SELF_MODIFYING_CODE 0x04000000
|
|
#define MAC_S_ATTR_DEBUG 0x02000000
|
|
#define MAC_S_ATTRIBUTES_SYS 0x00ffff00
|
|
#define MAC_S_ATTR_SOME_INSTRUCTIONS 0x00000400
|
|
#define MAC_S_ATTR_EXT_RELOC 0x00000200
|
|
#define MAC_S_ATTR_LOC_RELOC 0x00000100
|
|
|
|
#define MAC_LC_REQ_DYLD 0x80000000
|
|
#define MAC_LC_SEGMENT 0x1
|
|
#define MAC_LC_SYMTAB 0x2
|
|
#define MAC_LC_SYMSEG 0x3
|
|
#define MAC_LC_THREAD 0x4
|
|
#define MAC_LC_UNIXTHREAD 0x5
|
|
#define MAC_LC_LOADFVMLIB 0x6
|
|
#define MAC_LC_IDFVMLIB 0x7
|
|
#define MAC_LC_IDENT 0x8
|
|
#define MAC_LC_FVMFILE 0x9
|
|
#define MAC_LC_PREPAGE 0xa
|
|
#define MAC_LC_DYSYMTAB 0xb
|
|
#define MAC_LC_LOAD_DYLIB 0xc
|
|
#define MAC_LC_ID_DYLIB 0xd
|
|
#define MAC_LC_LOAD_DYLINKER 0xe
|
|
#define MAC_LC_ID_DYLINKER 0xf
|
|
#define MAC_LC_PREBOUND_DYLIB 0x10
|
|
#define MAC_LC_ROUTINES 0x11
|
|
#define MAC_LC_SUB_FRAMEWORK 0x12
|
|
#define MAC_LC_SUB_UMBRELLA 0x13
|
|
#define MAC_LC_SUB_CLIENT 0x14
|
|
#define MAC_LC_SUB_LIBRARY 0x15
|
|
#define MAC_LC_TWOLEVEL_HINTS 0x16
|
|
#define MAC_LC_PREBIND_CKSUM 0x17
|
|
#define MAC_LC_LOAD_WEAK_DYLIB (0x18 | MAC_LC_REQ_DYLD)
|
|
#define MAC_LC_SEGMENT_64 0x19
|
|
#define MAC_LC_ROUTINES_64 0x1a
|
|
#define MAC_LC_UUID 0x1b
|
|
#define MAC_LC_CODE_SIGNATURE 0x1d
|
|
#define MAC_LC_SEGMENT_SPLIT_INFO 0x1e
|
|
#define MAC_LC_LAZY_LOAD_DYLIB 0x20
|
|
#define MAC_LC_ENCRYPTION_INFO 0x21
|
|
#define MAC_LC_DYLD_INFO 0x22
|
|
#define MAC_LC_DYLD_INFO_ONLY (0x22 | MAC_LC_REQ_DYLD)
|
|
#define MAC_LC_VERSION_MIN_MACOSX 0x24
|
|
#define MAC_LC_VERSION_MIN_IPHONEOS 0x25
|
|
#define MAC_LC_FUNCTION_STARTS 0x26
|
|
#define MAC_LC_DYLD_ENVIRONMENT 0x27
|
|
#define MAC_LC_DATA_IN_CODE 0x29
|
|
#define MAC_LC_SOURCE_VERSION 0x2a
|
|
#define MAC_LC_DYLIB_CODE_SIGN_DRS 0x2B
|
|
#define MAC_LC_ENCRYPTION_INFO_64 0x2C
|
|
#define MAC_LC_LINKER_OPTION 0x2D
|
|
#define MAC_LC_LINKER_OPTIMIZATION_HINT 0x2E
|
|
#define MAC_LC_VERSION_MIN_TVOS 0x2F
|
|
#define MAC_LC_VERSION_MIN_WATCHOS 0x30
|
|
#define MAC_LC_NOTE 0x31
|
|
#define MAC_LC_BUILD_VERSION 0x32
|
|
#define MAC_LC_DYLD_EXPORTS_TRIE (0x33 | MAC_LC_REQ_DYLD)
|
|
#define MAC_LC_DYLD_CHAINED_FIXUPS (0x34 | MAC_LC_REQ_DYLD)
|
|
#define MAC_LC_FILESET_ENTRY (0x35 | MAC_LC_REQ_DYLD)
|
|
#define MAC_LC_RPATH (0x1c | MAC_LC_REQ_DYLD)
|
|
#define MAC_LC_MAIN (0x28 | MAC_LC_REQ_DYLD)
|
|
#define MAC_LC_REEXPORT_DYLIB (0x1f | MAC_LC_REQ_DYLD)
|
|
|
|
#define VM_PROT_NONE 0
|
|
#define VM_PROT_READ 1
|
|
#define VM_PROT_WRITE 2
|
|
#define VM_PROT_EXECUTE 4
|
|
#define VM_PROT_NO_CHANGE 8
|
|
#define VM_PROT_COPY 16
|
|
#define VM_PROT_TRUSTED 32
|
|
#define VM_PROT_STRIP_READ 64
|
|
|
|
#define MACHO_VERSION(x, y, z) ((x) << 16 | (y) << 8 | (z))
|
|
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
|
|
struct MachoHeader {
|
|
uint32_t magic;
|
|
uint32_t arch;
|
|
uint32_t arch2;
|
|
uint32_t filetype;
|
|
uint32_t loadcount;
|
|
uint32_t loadsize;
|
|
uint32_t flags;
|
|
uint32_t __reserved;
|
|
};
|
|
|
|
struct MachoLoadCommand {
|
|
uint32_t command;
|
|
uint32_t size;
|
|
};
|
|
|
|
struct MachoLoadSegment {
|
|
uint32_t command;
|
|
uint32_t size;
|
|
char name[16];
|
|
uint64_t vaddr;
|
|
uint64_t memsz;
|
|
uint64_t offset;
|
|
uint64_t filesz;
|
|
uint32_t maxprot;
|
|
uint32_t initprot;
|
|
uint32_t sectioncount;
|
|
uint32_t flags;
|
|
};
|
|
|
|
struct MachoSection {
|
|
char name[16];
|
|
char commandname[16];
|
|
uint64_t vaddr;
|
|
uint64_t memsz;
|
|
uint32_t offset;
|
|
uint32_t alignlog2;
|
|
uint32_t relotaboff;
|
|
uint32_t relocount;
|
|
uint32_t attr;
|
|
uint32_t __reserved[3];
|
|
};
|
|
|
|
struct MachoLoadSymtab {
|
|
uint32_t command;
|
|
uint32_t size;
|
|
uint32_t offset;
|
|
uint32_t count;
|
|
uint32_t stroff;
|
|
uint32_t strsize;
|
|
};
|
|
|
|
struct MachoLoadMinCommand {
|
|
uint32_t command;
|
|
uint32_t size;
|
|
uint32_t version; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */
|
|
uint32_t sdk;
|
|
};
|
|
|
|
struct MachoLoadSourceVersionCommand {
|
|
uint32_t command;
|
|
uint32_t size;
|
|
uint64_t version; /* A.B.C.D.E packed as a24.b10.c10.d10.e10 */
|
|
};
|
|
|
|
struct MachoLoadEntrypointCommand {
|
|
uint32_t command;
|
|
uint32_t size;
|
|
uint64_t entryoff;
|
|
uint64_t stacksize;
|
|
};
|
|
|
|
struct MachoLoadThreadCommand {
|
|
uint32_t command;
|
|
uint32_t size;
|
|
uint32_t flavor;
|
|
uint32_t count;
|
|
uint32_t wut[];
|
|
};
|
|
|
|
struct MachoLoadUuid {
|
|
uint32_t command;
|
|
uint32_t size;
|
|
uint8_t uuid[16];
|
|
};
|
|
|
|
struct MachoDyldInfoCommand {
|
|
uint32_t cmd;
|
|
uint32_t cmdsize;
|
|
uint32_t rebase_off;
|
|
uint32_t rebase_size;
|
|
uint32_t bind_off;
|
|
uint32_t bind_size;
|
|
uint32_t weak_bind_off;
|
|
uint32_t weak_bind_size;
|
|
uint32_t lazy_bind_off;
|
|
uint32_t lazy_bind_size;
|
|
uint32_t export_off;
|
|
uint32_t export_size;
|
|
};
|
|
|
|
struct MachoDylib {
|
|
uint32_t name; /* (char *)&lc->command + name */
|
|
uint32_t timestamp;
|
|
uint32_t current_version; /* MACHO_VERSION(x,y,z) */
|
|
uint32_t compatibility_version; /* MACHO_VERSION(x,y,z) */
|
|
};
|
|
|
|
struct MachoDylibCommand {
|
|
uint32_t cmd;
|
|
uint32_t cmdsize;
|
|
struct MachoDylib dylib;
|
|
};
|
|
|
|
struct MachoEntryPointCommand {
|
|
uint32_t cmd; /* MAC_LC_MAIN */
|
|
uint32_t cmdsize; /* 24 */
|
|
uint64_t entryoff; /* __TEXT offset of _start() */
|
|
uint64_t stacksize; /* initial stack size [optional] */
|
|
};
|
|
|
|
struct MachoLinkeditDataCommand {
|
|
/* MAC_LC_CODE_SIGNATURE */
|
|
/* MAC_LC_SEGMENT_SPLIT_INFO */
|
|
/* MAC_LC_FUNCTION_STARTS */
|
|
/* MAC_LC_DATA_IN_CODE */
|
|
/* MAC_LC_DYLIB_CODE_SIGN_DRS */
|
|
/* MAC_LC_LINKER_OPTIMIZATION_HINT */
|
|
/* MAC_LC_DYLD_EXPORTS_TRIE */
|
|
/* MAC_LC_DYLD_CHAINED_FIXUPS */
|
|
uint32_t cmd;
|
|
uint32_t cmdsize;
|
|
uint32_t dataoff;
|
|
uint32_t datasize;
|
|
};
|
|
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* !ANSI */
|
|
#endif /* COSMOPOLITAN_LIBC_MACHO_H_ */
|