Skip to main content

macho_core/format/
constants.rs

1// Mach-O magic numbers
2/// The MH_MAGIC constant.
3pub const MH_MAGIC: u32 = 0xfeed_face;
4/// The MH_CIGAM constant.
5pub const MH_CIGAM: u32 = 0xcefa_edfe;
6/// The MH_MAGIC_64 constant.
7pub const MH_MAGIC_64: u32 = 0xfeed_facf;
8/// The MH_CIGAM_64 constant.
9pub const MH_CIGAM_64: u32 = 0xcffa_edfe;
10
11// Fat binary magic numbers (always big-endian on disk)
12/// The FAT_MAGIC constant.
13pub const FAT_MAGIC: u32 = 0xcafe_babe;
14/// The FAT_CIGAM constant.
15pub const FAT_CIGAM: u32 = 0xbeba_feca;
16/// The FAT_MAGIC_64 constant.
17pub const FAT_MAGIC_64: u32 = 0xcafe_babf;
18/// The FAT_CIGAM_64 constant.
19pub const FAT_CIGAM_64: u32 = 0xbfba_feca;
20
21// File types
22/// The MH_OBJECT constant.
23pub const MH_OBJECT: u32 = 0x1;
24/// The MH_EXECUTE constant.
25pub const MH_EXECUTE: u32 = 0x2;
26/// The MH_FVMLIB constant.
27pub const MH_FVMLIB: u32 = 0x3;
28/// The MH_CORE constant.
29pub const MH_CORE: u32 = 0x4;
30/// The MH_PRELOAD constant.
31pub const MH_PRELOAD: u32 = 0x5;
32/// The MH_DYLIB constant.
33pub const MH_DYLIB: u32 = 0x6;
34/// The MH_DYLINKER constant.
35pub const MH_DYLINKER: u32 = 0x7;
36/// The MH_BUNDLE constant.
37pub const MH_BUNDLE: u32 = 0x8;
38/// The MH_DYLIB_STUB constant.
39pub const MH_DYLIB_STUB: u32 = 0x9;
40/// The MH_DSYM constant.
41pub const MH_DSYM: u32 = 0xa;
42/// The MH_KEXT_BUNDLE constant.
43pub const MH_KEXT_BUNDLE: u32 = 0xb;
44/// The MH_FILESET constant.
45pub const MH_FILESET: u32 = 0xc;
46/// The MH_GPU_EXECUTE constant.
47pub const MH_GPU_EXECUTE: u32 = 0xd;
48/// The MH_GPU_DYLIB constant.
49pub const MH_GPU_DYLIB: u32 = 0xe;
50
51bitflags::bitflags! {
52    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
53    /// The MachoHeaderFlags flag value.
54    pub struct MachoHeaderFlags: u32 {
55        /// The NOUNDEFS flag value.
56        const NOUNDEFS                      = 0x0000_0001;
57        /// The INCRLINK flag value.
58        const INCRLINK                      = 0x0000_0002;
59        /// The DYLDLINK flag value.
60        const DYLDLINK                      = 0x0000_0004;
61        /// The BINDATLOAD flag value.
62        const BINDATLOAD                    = 0x0000_0008;
63        /// The PREBOUND flag value.
64        const PREBOUND                      = 0x0000_0010;
65        /// The SPLIT_SEGS flag value.
66        const SPLIT_SEGS                    = 0x0000_0020;
67        /// The LAZY_INIT flag value.
68        const LAZY_INIT                     = 0x0000_0040;
69        /// The TWOLEVEL flag value.
70        const TWOLEVEL                      = 0x0000_0080;
71        /// The FORCE_FLAT flag value.
72        const FORCE_FLAT                    = 0x0000_0100;
73        /// The NOMULTIDEFS flag value.
74        const NOMULTIDEFS                   = 0x0000_0200;
75        /// The NOFIXPREBINDING flag value.
76        const NOFIXPREBINDING               = 0x0000_0400;
77        /// The PREBINDABLE flag value.
78        const PREBINDABLE                   = 0x0000_0800;
79        /// The ALLMODSBOUND flag value.
80        const ALLMODSBOUND                  = 0x0000_1000;
81        /// The SUBSECTIONS_VIA_SYMBOLS flag value.
82        const SUBSECTIONS_VIA_SYMBOLS       = 0x0000_2000;
83        /// The CANONICAL flag value.
84        const CANONICAL                     = 0x0000_4000;
85        /// The WEAK_DEFINES flag value.
86        const WEAK_DEFINES                  = 0x0000_8000;
87        /// The BINDS_TO_WEAK flag value.
88        const BINDS_TO_WEAK                 = 0x0001_0000;
89        /// The ALLOW_STACK_EXECUTION flag value.
90        const ALLOW_STACK_EXECUTION         = 0x0002_0000;
91        /// The ROOT_SAFE flag value.
92        const ROOT_SAFE                     = 0x0004_0000;
93        /// The SETUID_SAFE flag value.
94        const SETUID_SAFE                   = 0x0008_0000;
95        /// The NO_REEXPORTED_DYLIBS flag value.
96        const NO_REEXPORTED_DYLIBS          = 0x0010_0000;
97        /// The PIE flag value.
98        const PIE                           = 0x0020_0000;
99        /// The DEAD_STRIPPABLE_DYLIB flag value.
100        const DEAD_STRIPPABLE_DYLIB         = 0x0040_0000;
101        /// The HAS_TLV_DESCRIPTORS flag value.
102        const HAS_TLV_DESCRIPTORS           = 0x0080_0000;
103        /// The NO_HEAP_EXECUTION flag value.
104        const NO_HEAP_EXECUTION             = 0x0100_0000;
105        /// The APP_EXTENSION_SAFE flag value.
106        const APP_EXTENSION_SAFE            = 0x0200_0000;
107        /// The NLIST_OUTOFSYNC_WITH_DYLDINFO flag value.
108        const NLIST_OUTOFSYNC_WITH_DYLDINFO = 0x0400_0000;
109        /// The SIM_SUPPORT flag value.
110        const SIM_SUPPORT                   = 0x0800_0000;
111        /// The IMPLICIT_PAGEZERO flag value.
112        const IMPLICIT_PAGEZERO             = 0x1000_0000;
113        /// The DYLIB_IN_CACHE flag value.
114        const DYLIB_IN_CACHE                = 0x8000_0000;
115    }
116}
117
118// Load command constants
119/// The LC_REQ_DYLD constant.
120pub const LC_REQ_DYLD: u32 = 0x8000_0000;
121
122/// The LC_SEGMENT constant.
123pub const LC_SEGMENT: u32 = 0x1;
124/// The LC_SYMTAB constant.
125pub const LC_SYMTAB: u32 = 0x2;
126/// The LC_SYMSEG constant.
127pub const LC_SYMSEG: u32 = 0x3;
128/// The LC_THREAD constant.
129pub const LC_THREAD: u32 = 0x4;
130/// The LC_UNIXTHREAD constant.
131pub const LC_UNIXTHREAD: u32 = 0x5;
132/// The LC_LOADFVMLIB constant.
133pub const LC_LOADFVMLIB: u32 = 0x6;
134/// The LC_IDFVMLIB constant.
135pub const LC_IDFVMLIB: u32 = 0x7;
136/// The LC_IDENT constant.
137pub const LC_IDENT: u32 = 0x8;
138/// The LC_FVMFILE constant.
139pub const LC_FVMFILE: u32 = 0x9;
140/// The LC_PREPAGE constant.
141pub const LC_PREPAGE: u32 = 0xa;
142/// The LC_DYSYMTAB constant.
143pub const LC_DYSYMTAB: u32 = 0xb;
144/// The LC_LOAD_DYLIB constant.
145pub const LC_LOAD_DYLIB: u32 = 0xc;
146/// The LC_ID_DYLIB constant.
147pub const LC_ID_DYLIB: u32 = 0xd;
148/// The LC_LOAD_DYLINKER constant.
149pub const LC_LOAD_DYLINKER: u32 = 0xe;
150/// The LC_ID_DYLINKER constant.
151pub const LC_ID_DYLINKER: u32 = 0xf;
152/// The LC_PREBOUND_DYLIB constant.
153pub const LC_PREBOUND_DYLIB: u32 = 0x10;
154/// The LC_ROUTINES constant.
155pub const LC_ROUTINES: u32 = 0x11;
156/// The LC_SUB_FRAMEWORK constant.
157pub const LC_SUB_FRAMEWORK: u32 = 0x12;
158/// The LC_SUB_UMBRELLA constant.
159pub const LC_SUB_UMBRELLA: u32 = 0x13;
160/// The LC_SUB_CLIENT constant.
161pub const LC_SUB_CLIENT: u32 = 0x14;
162/// The LC_SUB_LIBRARY constant.
163pub const LC_SUB_LIBRARY: u32 = 0x15;
164/// The LC_TWOLEVEL_HINTS constant.
165pub const LC_TWOLEVEL_HINTS: u32 = 0x16;
166/// The LC_PREBIND_CKSUM constant.
167pub const LC_PREBIND_CKSUM: u32 = 0x17;
168/// The LC_LOAD_WEAK_DYLIB constant.
169pub const LC_LOAD_WEAK_DYLIB: u32 = 0x18 | LC_REQ_DYLD;
170/// The LC_SEGMENT_64 constant.
171pub const LC_SEGMENT_64: u32 = 0x19;
172/// The LC_ROUTINES_64 constant.
173pub const LC_ROUTINES_64: u32 = 0x1a;
174/// The LC_UUID constant.
175pub const LC_UUID: u32 = 0x1b;
176/// The LC_RPATH constant.
177pub const LC_RPATH: u32 = 0x1c | LC_REQ_DYLD;
178/// The LC_CODE_SIGNATURE constant.
179pub const LC_CODE_SIGNATURE: u32 = 0x1d;
180/// The LC_SEGMENT_SPLIT_INFO constant.
181pub const LC_SEGMENT_SPLIT_INFO: u32 = 0x1e;
182/// The LC_REEXPORT_DYLIB constant.
183pub const LC_REEXPORT_DYLIB: u32 = 0x1f | LC_REQ_DYLD;
184/// The LC_LAZY_LOAD_DYLIB constant.
185pub const LC_LAZY_LOAD_DYLIB: u32 = 0x20;
186/// The LC_ENCRYPTION_INFO constant.
187pub const LC_ENCRYPTION_INFO: u32 = 0x21;
188/// The LC_DYLD_INFO constant.
189pub const LC_DYLD_INFO: u32 = 0x22;
190/// The LC_DYLD_INFO_ONLY constant.
191pub const LC_DYLD_INFO_ONLY: u32 = 0x22 | LC_REQ_DYLD;
192/// The LC_LOAD_UPWARD_DYLIB constant.
193pub const LC_LOAD_UPWARD_DYLIB: u32 = 0x23 | LC_REQ_DYLD;
194/// The LC_VERSION_MIN_MACOSX constant.
195pub const LC_VERSION_MIN_MACOSX: u32 = 0x24;
196/// The LC_VERSION_MIN_IPHONEOS constant.
197pub const LC_VERSION_MIN_IPHONEOS: u32 = 0x25;
198/// The LC_FUNCTION_STARTS constant.
199pub const LC_FUNCTION_STARTS: u32 = 0x26;
200/// The LC_DYLD_ENVIRONMENT constant.
201pub const LC_DYLD_ENVIRONMENT: u32 = 0x27;
202/// The LC_MAIN constant.
203pub const LC_MAIN: u32 = 0x28 | LC_REQ_DYLD;
204/// The LC_DATA_IN_CODE constant.
205pub const LC_DATA_IN_CODE: u32 = 0x29;
206/// The LC_SOURCE_VERSION constant.
207pub const LC_SOURCE_VERSION: u32 = 0x2a;
208/// The LC_DYLIB_CODE_SIGN_DRS constant.
209pub const LC_DYLIB_CODE_SIGN_DRS: u32 = 0x2b;
210/// The LC_ENCRYPTION_INFO_64 constant.
211pub const LC_ENCRYPTION_INFO_64: u32 = 0x2c;
212/// The LC_LINKER_OPTION constant.
213pub const LC_LINKER_OPTION: u32 = 0x2d;
214/// The LC_LINKER_OPTIMIZATION_HINT constant.
215pub const LC_LINKER_OPTIMIZATION_HINT: u32 = 0x2e;
216/// The LC_VERSION_MIN_TVOS constant.
217pub const LC_VERSION_MIN_TVOS: u32 = 0x2f;
218/// The LC_VERSION_MIN_WATCHOS constant.
219pub const LC_VERSION_MIN_WATCHOS: u32 = 0x30;
220/// The LC_NOTE constant.
221pub const LC_NOTE: u32 = 0x31;
222/// The LC_BUILD_VERSION constant.
223pub const LC_BUILD_VERSION: u32 = 0x32;
224/// The LC_DYLD_EXPORTS_TRIE constant.
225pub const LC_DYLD_EXPORTS_TRIE: u32 = 0x33 | LC_REQ_DYLD;
226/// The LC_DYLD_CHAINED_FIXUPS constant.
227pub const LC_DYLD_CHAINED_FIXUPS: u32 = 0x34 | LC_REQ_DYLD;
228/// The LC_FILESET_ENTRY constant.
229pub const LC_FILESET_ENTRY: u32 = 0x35 | LC_REQ_DYLD;
230/// The LC_ATOM_INFO constant.
231pub const LC_ATOM_INFO: u32 = 0x36;
232/// The LC_FUNCTION_VARIANTS constant.
233pub const LC_FUNCTION_VARIANTS: u32 = 0x37;
234/// The LC_FUNCTION_VARIANT_FIXUPS constant.
235pub const LC_FUNCTION_VARIANT_FIXUPS: u32 = 0x38;
236/// The LC_TARGET_TRIPLE constant.
237pub const LC_TARGET_TRIPLE: u32 = 0x39;
238
239// Section type mask and values
240/// The SECTION_TYPE_MASK constant.
241pub const SECTION_TYPE_MASK: u32 = 0x0000_00ff;
242/// The SECTION_ATTRIBUTES_MASK constant.
243pub const SECTION_ATTRIBUTES_MASK: u32 = 0xffff_ff00;
244
245/// The S_REGULAR constant.
246pub const S_REGULAR: u8 = 0x0;
247/// The S_ZEROFILL constant.
248pub const S_ZEROFILL: u8 = 0x1;
249/// The S_CSTRING_LITERALS constant.
250pub const S_CSTRING_LITERALS: u8 = 0x2;
251/// The S_4BYTE_LITERALS constant.
252pub const S_4BYTE_LITERALS: u8 = 0x3;
253/// The S_8BYTE_LITERALS constant.
254pub const S_8BYTE_LITERALS: u8 = 0x4;
255/// The S_LITERAL_POINTERS constant.
256pub const S_LITERAL_POINTERS: u8 = 0x5;
257/// The S_NON_LAZY_SYMBOL_POINTERS constant.
258pub const S_NON_LAZY_SYMBOL_POINTERS: u8 = 0x6;
259/// The S_LAZY_SYMBOL_POINTERS constant.
260pub const S_LAZY_SYMBOL_POINTERS: u8 = 0x7;
261/// The S_SYMBOL_STUBS constant.
262pub const S_SYMBOL_STUBS: u8 = 0x8;
263/// The S_MOD_INIT_FUNC_POINTERS constant.
264pub const S_MOD_INIT_FUNC_POINTERS: u8 = 0x9;
265/// The S_MOD_TERM_FUNC_POINTERS constant.
266pub const S_MOD_TERM_FUNC_POINTERS: u8 = 0xa;
267/// The S_COALESCED constant.
268pub const S_COALESCED: u8 = 0xb;
269/// The S_GB_ZEROFILL constant.
270pub const S_GB_ZEROFILL: u8 = 0xc;
271/// The S_INTERPOSING constant.
272pub const S_INTERPOSING: u8 = 0xd;
273/// The S_16BYTE_LITERALS constant.
274pub const S_16BYTE_LITERALS: u8 = 0xe;
275/// The S_DTRACE_DOF constant.
276pub const S_DTRACE_DOF: u8 = 0xf;
277/// The S_LAZY_DYLIB_SYMBOL_POINTERS constant.
278pub const S_LAZY_DYLIB_SYMBOL_POINTERS: u8 = 0x10;
279/// The S_THREAD_LOCAL_REGULAR constant.
280pub const S_THREAD_LOCAL_REGULAR: u8 = 0x11;
281/// The S_THREAD_LOCAL_ZEROFILL constant.
282pub const S_THREAD_LOCAL_ZEROFILL: u8 = 0x12;
283/// The S_THREAD_LOCAL_VARIABLES constant.
284pub const S_THREAD_LOCAL_VARIABLES: u8 = 0x13;
285/// The S_THREAD_LOCAL_VARIABLE_POINTERS constant.
286pub const S_THREAD_LOCAL_VARIABLE_POINTERS: u8 = 0x14;
287/// The S_THREAD_LOCAL_INIT_FUNCTION_POINTERS constant.
288pub const S_THREAD_LOCAL_INIT_FUNCTION_POINTERS: u8 = 0x15;
289/// The S_INIT_FUNC_OFFSETS constant.
290pub const S_INIT_FUNC_OFFSETS: u8 = 0x16;
291
292bitflags::bitflags! {
293    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
294    /// The SectionAttributes flag value.
295    pub struct SectionAttributes: u32 {
296        /// The PURE_INSTRUCTIONS flag value.
297        const PURE_INSTRUCTIONS   = 0x8000_0000;
298        /// The NO_TOC flag value.
299        const NO_TOC              = 0x4000_0000;
300        /// The STRIP_STATIC_SYMS flag value.
301        const STRIP_STATIC_SYMS   = 0x2000_0000;
302        /// The NO_DEAD_STRIP flag value.
303        const NO_DEAD_STRIP       = 0x1000_0000;
304        /// The LIVE_SUPPORT flag value.
305        const LIVE_SUPPORT        = 0x0800_0000;
306        /// The SELF_MODIFYING_CODE flag value.
307        const SELF_MODIFYING_CODE = 0x0400_0000;
308        /// The DEBUG flag value.
309        const DEBUG               = 0x0200_0000;
310        /// The SOME_INSTRUCTIONS flag value.
311        const SOME_INSTRUCTIONS   = 0x0000_0400;
312        /// The EXT_RELOC flag value.
313        const EXT_RELOC           = 0x0000_0200;
314        /// The LOC_RELOC flag value.
315        const LOC_RELOC           = 0x0000_0100;
316    }
317}
318
319bitflags::bitflags! {
320    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
321    /// The SegmentFlags flag value.
322    pub struct SegmentFlags: u32 {
323        /// The HIGHVM flag value.
324        const HIGHVM              = 0x1;
325        /// The FVMLIB flag value.
326        const FVMLIB              = 0x2;
327        /// The NORELOC flag value.
328        const NORELOC             = 0x4;
329        /// The PROTECTED_VERSION_1 flag value.
330        const PROTECTED_VERSION_1 = 0x8;
331        /// The READ_ONLY flag value.
332        const READ_ONLY           = 0x10;
333    }
334}
335
336bitflags::bitflags! {
337    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
338    /// The VmProtection flag value.
339    pub struct VmProtection: i32 {
340        /// The READ flag value.
341        const READ    = 0x1;
342        /// The WRITE flag value.
343        const WRITE   = 0x2;
344        /// The EXECUTE flag value.
345        const EXECUTE = 0x4;
346    }
347}
348
349impl VmProtection {
350    /// Performs rwx_string.
351    pub fn rwx_string(self) -> String {
352        let r = if self.contains(Self::READ) { 'r' } else { '-' };
353        let w = if self.contains(Self::WRITE) { 'w' } else { '-' };
354        let x = if self.contains(Self::EXECUTE) {
355            'x'
356        } else {
357            '-'
358        };
359        format!("{r}{w}{x}")
360    }
361}
362
363impl std::fmt::Display for VmProtection {
364    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
365        f.write_str(&self.rwx_string())
366    }
367}
368
369// CPU type constants
370/// The CPU_ARCH_ABI64 constant.
371pub const CPU_ARCH_ABI64: i32 = 0x0100_0000;
372/// The CPU_ARCH_ABI64_32 constant.
373pub const CPU_ARCH_ABI64_32: i32 = 0x0200_0000;
374
375/// The CPU_TYPE_ANY constant.
376pub const CPU_TYPE_ANY: i32 = -1;
377/// The CPU_TYPE_X86 constant.
378pub const CPU_TYPE_X86: i32 = 7;
379/// The CPU_TYPE_X86_64 constant.
380pub const CPU_TYPE_X86_64: i32 = CPU_TYPE_X86 | CPU_ARCH_ABI64;
381/// The CPU_TYPE_ARM constant.
382pub const CPU_TYPE_ARM: i32 = 12;
383/// The CPU_TYPE_ARM64 constant.
384pub const CPU_TYPE_ARM64: i32 = CPU_TYPE_ARM | CPU_ARCH_ABI64;
385/// The CPU_TYPE_ARM64_32 constant.
386pub const CPU_TYPE_ARM64_32: i32 = CPU_TYPE_ARM | CPU_ARCH_ABI64_32;
387/// The CPU_TYPE_POWERPC constant.
388pub const CPU_TYPE_POWERPC: i32 = 18;
389/// The CPU_TYPE_POWERPC64 constant.
390pub const CPU_TYPE_POWERPC64: i32 = CPU_TYPE_POWERPC | CPU_ARCH_ABI64;
391
392// CPU subtype mask: strips capability bits (high byte) from cpusubtype
393/// The CPU_SUBTYPE_MASK constant.
394pub const CPU_SUBTYPE_MASK: i32 = 0x00FF_FFFF;
395
396// CPU subtype constants
397/// The CPU_SUBTYPE_ALL constant.
398pub const CPU_SUBTYPE_ALL: i32 = 0;
399/// The CPU_SUBTYPE_X86_64_ALL constant.
400pub const CPU_SUBTYPE_X86_64_ALL: i32 = 3;
401/// The CPU_SUBTYPE_X86_64_H constant.
402pub const CPU_SUBTYPE_X86_64_H: i32 = 8;
403/// The CPU_SUBTYPE_ARM64_ALL constant.
404pub const CPU_SUBTYPE_ARM64_ALL: i32 = 0;
405/// The CPU_SUBTYPE_ARM64_V8 constant.
406pub const CPU_SUBTYPE_ARM64_V8: i32 = 1;
407/// The CPU_SUBTYPE_ARM64E constant.
408pub const CPU_SUBTYPE_ARM64E: i32 = 2;
409/// The CPU_SUBTYPE_ARM64_32_ALL constant.
410pub const CPU_SUBTYPE_ARM64_32_ALL: i32 = 0;
411
412// Platform constants
413/// The PLATFORM_UNKNOWN constant.
414pub const PLATFORM_UNKNOWN: u32 = 0;
415/// The PLATFORM_ANY constant.
416pub const PLATFORM_ANY: u32 = 0xFFFF_FFFF;
417/// The PLATFORM_MACOS constant.
418pub const PLATFORM_MACOS: u32 = 1;
419/// The PLATFORM_IOS constant.
420pub const PLATFORM_IOS: u32 = 2;
421/// The PLATFORM_TVOS constant.
422pub const PLATFORM_TVOS: u32 = 3;
423/// The PLATFORM_WATCHOS constant.
424pub const PLATFORM_WATCHOS: u32 = 4;
425/// The PLATFORM_BRIDGEOS constant.
426pub const PLATFORM_BRIDGEOS: u32 = 5;
427/// The PLATFORM_MACCATALYST constant.
428pub const PLATFORM_MACCATALYST: u32 = 6;
429/// The PLATFORM_IOSSIMULATOR constant.
430pub const PLATFORM_IOSSIMULATOR: u32 = 7;
431/// The PLATFORM_TVOSSIMULATOR constant.
432pub const PLATFORM_TVOSSIMULATOR: u32 = 8;
433/// The PLATFORM_WATCHOSSIMULATOR constant.
434pub const PLATFORM_WATCHOSSIMULATOR: u32 = 9;
435/// The PLATFORM_DRIVERKIT constant.
436pub const PLATFORM_DRIVERKIT: u32 = 10;
437/// The PLATFORM_VISIONOS constant.
438pub const PLATFORM_VISIONOS: u32 = 11;
439/// The PLATFORM_VISIONOSSIMULATOR constant.
440pub const PLATFORM_VISIONOSSIMULATOR: u32 = 12;
441/// The PLATFORM_FIRMWARE constant.
442pub const PLATFORM_FIRMWARE: u32 = 13;
443/// The PLATFORM_SEPOS constant.
444pub const PLATFORM_SEPOS: u32 = 14;
445
446// Tool constants
447/// The TOOL_CLANG constant.
448pub const TOOL_CLANG: u32 = 1;
449/// The TOOL_SWIFT constant.
450pub const TOOL_SWIFT: u32 = 2;
451/// The TOOL_LD constant.
452pub const TOOL_LD: u32 = 3;
453/// The TOOL_LLD constant.
454pub const TOOL_LLD: u32 = 4;
455/// The TOOL_METAL constant.
456pub const TOOL_METAL: u32 = 1024;
457/// The TOOL_AIRLLD constant.
458pub const TOOL_AIRLLD: u32 = 1025;
459/// The TOOL_AIRNT constant.
460pub const TOOL_AIRNT: u32 = 1026;
461/// The TOOL_AIRNT_PLUGIN constant.
462pub const TOOL_AIRNT_PLUGIN: u32 = 1027;
463/// The TOOL_AIRPACK constant.
464pub const TOOL_AIRPACK: u32 = 1028;
465/// The TOOL_GPUARCHIVER constant.
466pub const TOOL_GPUARCHIVER: u32 = 1031;
467/// The TOOL_METAL_FRAMEWORK constant.
468pub const TOOL_METAL_FRAMEWORK: u32 = 1032;
469
470// Dylib use marker (for detecting dylib_use_command vs dylib_command)
471/// The DYLIB_USE_MARKER constant.
472pub const DYLIB_USE_MARKER: u32 = 0x1a74_1800;
473
474// Symbol table n_type masks
475/// The N_STAB constant.
476pub const N_STAB: u8 = 0xe0;
477/// The N_PEXT constant.
478pub const N_PEXT: u8 = 0x10;
479/// The N_TYPE constant.
480pub const N_TYPE: u8 = 0x0e;
481/// The N_EXT constant.
482pub const N_EXT: u8 = 0x01;
483
484// Symbol type values (after masking with N_TYPE)
485/// The N_UNDF constant.
486pub const N_UNDF: u8 = 0x0;
487/// The N_ABS constant.
488pub const N_ABS: u8 = 0x2;
489/// The N_SECT constant.
490pub const N_SECT: u8 = 0xe;
491/// The N_PBUD constant.
492pub const N_PBUD: u8 = 0xc;
493/// The N_INDR constant.
494pub const N_INDR: u8 = 0xa;
495
496// Section ordinals
497/// The NO_SECT constant.
498pub const NO_SECT: u8 = 0;
499
500// n_desc flags
501/// The N_ARM_THUMB_DEF constant.
502pub const N_ARM_THUMB_DEF: u16 = 0x0008;
503/// The REFERENCED_DYNAMICALLY constant.
504pub const REFERENCED_DYNAMICALLY: u16 = 0x0010;
505/// The N_NO_DEAD_STRIP constant.
506pub const N_NO_DEAD_STRIP: u16 = 0x0020;
507/// The N_WEAK_REF constant.
508pub const N_WEAK_REF: u16 = 0x0040;
509/// The N_WEAK_DEF constant.
510pub const N_WEAK_DEF: u16 = 0x0080;
511/// The N_SYMBOL_RESOLVER constant.
512pub const N_SYMBOL_RESOLVER: u16 = 0x0100;
513/// The N_ALT_ENTRY constant.
514pub const N_ALT_ENTRY: u16 = 0x0200;
515/// The N_COLD_FUNC constant.
516pub const N_COLD_FUNC: u16 = 0x0400;
517
518// Library ordinal helpers (extracted from bits 8-15 of n_desc)
519/// The SELF_LIBRARY_ORDINAL constant.
520pub const SELF_LIBRARY_ORDINAL: u8 = 0x0;
521/// The MAX_LIBRARY_ORDINAL constant.
522pub const MAX_LIBRARY_ORDINAL: u8 = 0xfd;
523/// The DYNAMIC_LOOKUP_ORDINAL constant.
524pub const DYNAMIC_LOOKUP_ORDINAL: u8 = 0xfe;
525/// The EXECUTABLE_ORDINAL constant.
526pub const EXECUTABLE_ORDINAL: u8 = 0xff;
527
528// Reference type mask (bits 0-2 of n_desc for undefined symbols)
529/// The REFERENCE_TYPE constant.
530pub const REFERENCE_TYPE: u16 = 0x7;
531
532// Relocation constants
533/// The R_SCATTERED constant.
534pub const R_SCATTERED: u32 = 0x8000_0000;
535/// The R_ABS constant.
536pub const R_ABS: u8 = 0;
537
538// Generic relocation types
539/// The GENERIC_RELOC_VANILLA constant.
540pub const GENERIC_RELOC_VANILLA: u8 = 0;
541/// The GENERIC_RELOC_PAIR constant.
542pub const GENERIC_RELOC_PAIR: u8 = 1;
543/// The GENERIC_RELOC_SECTDIFF constant.
544pub const GENERIC_RELOC_SECTDIFF: u8 = 2;
545/// The GENERIC_RELOC_PB_LA_PTR constant.
546pub const GENERIC_RELOC_PB_LA_PTR: u8 = 3;
547/// The GENERIC_RELOC_LOCAL_SECTDIFF constant.
548pub const GENERIC_RELOC_LOCAL_SECTDIFF: u8 = 4;
549/// The GENERIC_RELOC_TLV constant.
550pub const GENERIC_RELOC_TLV: u8 = 5;
551
552// ARM64 relocation types
553/// The ARM64_RELOC_UNSIGNED constant.
554pub const ARM64_RELOC_UNSIGNED: u8 = 0;
555/// The ARM64_RELOC_SUBTRACTOR constant.
556pub const ARM64_RELOC_SUBTRACTOR: u8 = 1;
557/// The ARM64_RELOC_BRANCH26 constant.
558pub const ARM64_RELOC_BRANCH26: u8 = 2;
559/// The ARM64_RELOC_PAGE21 constant.
560pub const ARM64_RELOC_PAGE21: u8 = 3;
561/// The ARM64_RELOC_PAGEOFF12 constant.
562pub const ARM64_RELOC_PAGEOFF12: u8 = 4;
563/// The ARM64_RELOC_GOT_LOAD_PAGE21 constant.
564pub const ARM64_RELOC_GOT_LOAD_PAGE21: u8 = 5;
565/// The ARM64_RELOC_GOT_LOAD_PAGEOFF12 constant.
566pub const ARM64_RELOC_GOT_LOAD_PAGEOFF12: u8 = 6;
567/// The ARM64_RELOC_POINTER_TO_GOT constant.
568pub const ARM64_RELOC_POINTER_TO_GOT: u8 = 7;
569/// The ARM64_RELOC_TLVP_LOAD_PAGE21 constant.
570pub const ARM64_RELOC_TLVP_LOAD_PAGE21: u8 = 8;
571/// The ARM64_RELOC_TLVP_LOAD_PAGEOFF12 constant.
572pub const ARM64_RELOC_TLVP_LOAD_PAGEOFF12: u8 = 9;
573/// The ARM64_RELOC_ADDEND constant.
574pub const ARM64_RELOC_ADDEND: u8 = 10;
575/// The ARM64_RELOC_AUTHENTICATED_POINTER constant.
576pub const ARM64_RELOC_AUTHENTICATED_POINTER: u8 = 11;
577
578// X86_64 relocation types
579/// The X86_64_RELOC_UNSIGNED constant.
580pub const X86_64_RELOC_UNSIGNED: u8 = 0;
581/// The X86_64_RELOC_SIGNED constant.
582pub const X86_64_RELOC_SIGNED: u8 = 1;
583/// The X86_64_RELOC_BRANCH constant.
584pub const X86_64_RELOC_BRANCH: u8 = 2;
585/// The X86_64_RELOC_GOT_LOAD constant.
586pub const X86_64_RELOC_GOT_LOAD: u8 = 3;
587/// The X86_64_RELOC_GOT constant.
588pub const X86_64_RELOC_GOT: u8 = 4;
589/// The X86_64_RELOC_SUBTRACTOR constant.
590pub const X86_64_RELOC_SUBTRACTOR: u8 = 5;
591/// The X86_64_RELOC_SIGNED_1 constant.
592pub const X86_64_RELOC_SIGNED_1: u8 = 6;
593/// The X86_64_RELOC_SIGNED_2 constant.
594pub const X86_64_RELOC_SIGNED_2: u8 = 7;
595/// The X86_64_RELOC_SIGNED_4 constant.
596pub const X86_64_RELOC_SIGNED_4: u8 = 8;
597/// The X86_64_RELOC_TLV constant.
598pub const X86_64_RELOC_TLV: u8 = 9;
599
600// Chained fixup pointer formats
601/// The DYLD_CHAINED_PTR_ARM64E constant.
602pub const DYLD_CHAINED_PTR_ARM64E: u16 = 1;
603/// The DYLD_CHAINED_PTR_64 constant.
604pub const DYLD_CHAINED_PTR_64: u16 = 2;
605/// The DYLD_CHAINED_PTR_32 constant.
606pub const DYLD_CHAINED_PTR_32: u16 = 3;
607/// The DYLD_CHAINED_PTR_32_CACHE constant.
608pub const DYLD_CHAINED_PTR_32_CACHE: u16 = 4;
609/// The DYLD_CHAINED_PTR_32_FIRMWARE constant.
610pub const DYLD_CHAINED_PTR_32_FIRMWARE: u16 = 5;
611/// The DYLD_CHAINED_PTR_64_OFFSET constant.
612pub const DYLD_CHAINED_PTR_64_OFFSET: u16 = 6;
613/// The DYLD_CHAINED_PTR_ARM64E_KERNEL constant.
614pub const DYLD_CHAINED_PTR_ARM64E_KERNEL: u16 = 7;
615/// The DYLD_CHAINED_PTR_64_KERNEL_CACHE constant.
616pub const DYLD_CHAINED_PTR_64_KERNEL_CACHE: u16 = 8;
617/// The DYLD_CHAINED_PTR_ARM64E_USERLAND constant.
618pub const DYLD_CHAINED_PTR_ARM64E_USERLAND: u16 = 9;
619/// The DYLD_CHAINED_PTR_ARM64E_FIRMWARE constant.
620pub const DYLD_CHAINED_PTR_ARM64E_FIRMWARE: u16 = 10;
621/// The DYLD_CHAINED_PTR_X86_64_KERNEL_CACHE constant.
622pub const DYLD_CHAINED_PTR_X86_64_KERNEL_CACHE: u16 = 11;
623/// The DYLD_CHAINED_PTR_ARM64E_USERLAND24 constant.
624pub const DYLD_CHAINED_PTR_ARM64E_USERLAND24: u16 = 12;
625
626// Chained fixup page start sentinels
627/// The DYLD_CHAINED_PTR_START_NONE constant.
628pub const DYLD_CHAINED_PTR_START_NONE: u16 = 0xFFFF;
629/// The DYLD_CHAINED_PTR_START_MULTI constant.
630pub const DYLD_CHAINED_PTR_START_MULTI: u16 = 0x8000;
631
632// Chained fixup import formats
633/// The DYLD_CHAINED_IMPORT constant.
634pub const DYLD_CHAINED_IMPORT: u32 = 1;
635/// The DYLD_CHAINED_IMPORT_ADDEND constant.
636pub const DYLD_CHAINED_IMPORT_ADDEND: u32 = 2;
637/// The DYLD_CHAINED_IMPORT_ADDEND64 constant.
638pub const DYLD_CHAINED_IMPORT_ADDEND64: u32 = 3;
639
640// Export symbol flags
641/// The EXPORT_SYMBOL_FLAGS_KIND_MASK constant.
642pub const EXPORT_SYMBOL_FLAGS_KIND_MASK: u32 = 0x03;
643/// The EXPORT_SYMBOL_FLAGS_KIND_REGULAR constant.
644pub const EXPORT_SYMBOL_FLAGS_KIND_REGULAR: u32 = 0x00;
645/// The EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL constant.
646pub const EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL: u32 = 0x01;
647/// The EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE constant.
648pub const EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE: u32 = 0x02;
649/// The EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION constant.
650pub const EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION: u32 = 0x04;
651/// The EXPORT_SYMBOL_FLAGS_REEXPORT constant.
652pub const EXPORT_SYMBOL_FLAGS_REEXPORT: u32 = 0x08;
653/// The EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER constant.
654pub const EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER: u32 = 0x10;
655/// The EXPORT_SYMBOL_FLAGS_STATIC_RESOLVER constant.
656pub const EXPORT_SYMBOL_FLAGS_STATIC_RESOLVER: u32 = 0x20;
657
658// Rebase opcodes (high nibble = opcode, low nibble = immediate)
659/// The REBASE_OPCODE_MASK constant.
660pub const REBASE_OPCODE_MASK: u8 = 0xF0;
661/// The REBASE_IMMEDIATE_MASK constant.
662pub const REBASE_IMMEDIATE_MASK: u8 = 0x0F;
663/// The REBASE_OPCODE_DONE constant.
664pub const REBASE_OPCODE_DONE: u8 = 0x00;
665/// The REBASE_OPCODE_SET_TYPE_IMM constant.
666pub const REBASE_OPCODE_SET_TYPE_IMM: u8 = 0x10;
667/// The REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB constant.
668pub const REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB: u8 = 0x20;
669/// The REBASE_OPCODE_ADD_ADDR_ULEB constant.
670pub const REBASE_OPCODE_ADD_ADDR_ULEB: u8 = 0x30;
671/// The REBASE_OPCODE_ADD_ADDR_IMM_SCALED constant.
672pub const REBASE_OPCODE_ADD_ADDR_IMM_SCALED: u8 = 0x40;
673/// The REBASE_OPCODE_DO_REBASE_IMM_TIMES constant.
674pub const REBASE_OPCODE_DO_REBASE_IMM_TIMES: u8 = 0x50;
675/// The REBASE_OPCODE_DO_REBASE_ULEB_TIMES constant.
676pub const REBASE_OPCODE_DO_REBASE_ULEB_TIMES: u8 = 0x60;
677/// The REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB constant.
678pub const REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB: u8 = 0x70;
679/// The REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING constant.
680pub const REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING: u8 = 0x80;
681
682/// The REBASE_TYPE_POINTER constant.
683pub const REBASE_TYPE_POINTER: u8 = 1;
684/// The REBASE_TYPE_TEXT_ABSOLUTE32 constant.
685pub const REBASE_TYPE_TEXT_ABSOLUTE32: u8 = 2;
686/// The REBASE_TYPE_TEXT_PCREL32 constant.
687pub const REBASE_TYPE_TEXT_PCREL32: u8 = 3;
688
689// Bind opcodes
690/// The BIND_OPCODE_MASK constant.
691pub const BIND_OPCODE_MASK: u8 = 0xF0;
692/// The BIND_IMMEDIATE_MASK constant.
693pub const BIND_IMMEDIATE_MASK: u8 = 0x0F;
694/// The BIND_OPCODE_DONE constant.
695pub const BIND_OPCODE_DONE: u8 = 0x00;
696/// The BIND_OPCODE_SET_DYLIB_ORDINAL_IMM constant.
697pub const BIND_OPCODE_SET_DYLIB_ORDINAL_IMM: u8 = 0x10;
698/// The BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB constant.
699pub const BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB: u8 = 0x20;
700/// The BIND_OPCODE_SET_DYLIB_SPECIAL_IMM constant.
701pub const BIND_OPCODE_SET_DYLIB_SPECIAL_IMM: u8 = 0x30;
702/// The BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM constant.
703pub const BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM: u8 = 0x40;
704/// The BIND_OPCODE_SET_TYPE_IMM constant.
705pub const BIND_OPCODE_SET_TYPE_IMM: u8 = 0x50;
706/// The BIND_OPCODE_SET_ADDEND_SLEB constant.
707pub const BIND_OPCODE_SET_ADDEND_SLEB: u8 = 0x60;
708/// The BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB constant.
709pub const BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB: u8 = 0x70;
710/// The BIND_OPCODE_ADD_ADDR_ULEB constant.
711pub const BIND_OPCODE_ADD_ADDR_ULEB: u8 = 0x80;
712/// The BIND_OPCODE_DO_BIND constant.
713pub const BIND_OPCODE_DO_BIND: u8 = 0x90;
714/// The BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB constant.
715pub const BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB: u8 = 0xA0;
716/// The BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED constant.
717pub const BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED: u8 = 0xB0;
718/// The BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB constant.
719pub const BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB: u8 = 0xC0;
720/// The BIND_OPCODE_THREADED constant.
721pub const BIND_OPCODE_THREADED: u8 = 0xD0;
722
723/// The BIND_SUBOPCODE_THREADED_SET_BIND_ORDINAL_TABLE_SIZE constant.
724pub const BIND_SUBOPCODE_THREADED_SET_BIND_ORDINAL_TABLE_SIZE: u8 = 0x00;
725/// The BIND_SUBOPCODE_THREADED_APPLY constant.
726pub const BIND_SUBOPCODE_THREADED_APPLY: u8 = 0x01;
727
728/// The BIND_TYPE_POINTER constant.
729pub const BIND_TYPE_POINTER: u8 = 1;
730/// The BIND_TYPE_TEXT_ABSOLUTE32 constant.
731pub const BIND_TYPE_TEXT_ABSOLUTE32: u8 = 2;
732/// The BIND_TYPE_TEXT_PCREL32 constant.
733pub const BIND_TYPE_TEXT_PCREL32: u8 = 3;
734
735/// The BIND_SPECIAL_DYLIB_SELF constant.
736pub const BIND_SPECIAL_DYLIB_SELF: i8 = 0;
737/// The BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE constant.
738pub const BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE: i8 = -1;
739/// The BIND_SPECIAL_DYLIB_FLAT_LOOKUP constant.
740pub const BIND_SPECIAL_DYLIB_FLAT_LOOKUP: i8 = -2;
741/// The BIND_SPECIAL_DYLIB_WEAK_LOOKUP constant.
742pub const BIND_SPECIAL_DYLIB_WEAK_LOOKUP: i8 = -3;