1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//! This module roughly corresponds to `mach-o/dyld_images.h`.

#![allow(non_snake_case)]

use crate::ffi::{
    c_uint, c_ulong,
    c_int,
    c_uchar, c_char,
    c_void,
};
use crate::ffi::uintptr_t;

use crate::mach_types::uuid_t;
use crate::port::mach_port_t;

#[repr(C)]
#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct mach_header {
    pub magic: c_uint,
    pub cputype: c_int,
    pub cpusubtype: c_int,
    pub filetype: c_uint,
    pub ncmds: c_uint,
    pub sizeofcmds: c_uint,
    pub flags: c_uint,
}

#[repr(C)]
#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct mach_header_64 {
    pub magic: c_uint,
    pub cputype: c_int,
    pub cpusubtype: c_int,
    pub filetype: c_uint,
    pub ncmds: c_uint,
    pub sizeofcmds: c_uint,
    pub flags: c_uint,
    pub reserved: c_uint,
}

#[repr(C)]
#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct segment_command_64 {
    pub cmd: c_uint,
    pub cmdsize: c_uint,
    pub segname: [c_char; 16],
    pub vmaddr: c_ulong,
    pub vmsize: c_ulong,
    pub fileoff: c_ulong,
    pub filesize: c_ulong,
    pub maxprot: c_int,
    pub initprot: c_int,
    pub nsects: c_uint,
    pub flags: c_uint,
}

#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct dyld_uuid_info {
    pub imageLoadAddress: *const mach_header,
    pub imageUUID: uuid_t,
}

#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct dyld_aot_image_info {
    pub x86LoadAddress: *const mach_header,
    pub aotLoadAddress: *const mach_header,
    pub aotImageSize: c_ulong,
    pub aotImageKey: [c_uchar; 32],
}

#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct dyld_image_info {
    pub imageLoadAddress: *mut mach_header,
    pub imageFilePath: *const c_char,
    pub imageFileModDate: uintptr_t,
}

pub type dyld_image_mode = c_uint;

pub type dyld_image_notifier = ::core::option::Option<
    unsafe extern "C" fn(mode: dyld_image_mode, infoCount: c_uint, info: *const dyld_image_info),
>;

#[repr(C, align(16))]
#[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)]
pub struct dyld_all_image_infos {
    pub version: c_uint,
    pub infoArrayCount: c_uint,
    pub infoArray: *const dyld_image_info,
    pub notification: dyld_image_notifier,
    pub processDetachedFromSharedRegion: bool,
    pub libSystemInitialized: bool,
    pub dyldImageLoadAddress: *const mach_header,
    pub jitInfo: *mut c_void,
    pub dyldVersion: *const c_char,
    pub errorMessage: *const c_char,
    pub terminationFlags: uintptr_t,
    pub coreSymbolicationShmPage: *mut c_void,
    pub systemOrderFlag: uintptr_t,
    pub uuidArrayCount: uintptr_t,
    pub uuidArray: *const dyld_uuid_info,
    pub dyldAllImageInfosAddress: *mut dyld_all_image_infos,
    pub initialImageCount: uintptr_t,
    pub errorKind: uintptr_t,
    pub errorClientOfDylibPath: *const c_char,
    pub errorTargetDylibPath: *const c_char,
    pub errorSymbol: *const c_char,
    pub sharedCacheSlide: uintptr_t,
    pub sharedCacheUUID: [c_uchar; 16],
    pub sharedCacheBaseAddress: uintptr_t,
    pub infoArrayChangeTimestamp: c_ulong,
    pub dyldPath: *const c_char,
    pub notifyPorts: [mach_port_t; 8],
    pub reserved: [uintptr_t; 7],
    pub sharedCacheFSID: c_ulong,
    pub sharedCacheFSObjID: c_ulong,
    pub compact_dyld_image_info_addr: uintptr_t,
    pub compact_dyld_image_info_size: uintptr_t,
    pub platform: c_uint,
    pub aotInfoCount: c_uint,
    pub aotInfoArray: *const dyld_aot_image_info,
    pub aotInfoArrayChangeTimestamp: c_ulong,
    pub aotSharedCacheBaseAddress: uintptr_t,
    pub aotSharedCacheUUID: [c_uchar; 16],
}