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
//! This module roughly corresponds to `mach-o/loader.h`.

use crate::ffi::{
    c_char,
    cpu_type_t,
    cpu_subtype_t,
};

#[repr(C)]
#[allow(dead_code, non_snake_case)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct mach_header {
    pub magic:      u32,
    pub cputype:    cpu_type_t,
    pub cpusubtype: cpu_subtype_t,
    pub filetype:   u32,
    pub ncmds:      u32,
    pub sizeofcmds: u32,
    pub flags:      u32,
}

pub const LC_SEGMENT:                 u32 = 1;
pub const LC_SEGMENT_64:              u32 = 25;
pub const LC_SYMTAB:                  u32 = 2;
pub const INDIRECT_SYMBOL_LOCAL:      u32 = 2147483648;
pub const INDIRECT_SYMBOL_ABS:        u32 = 1073741824;
pub const SECTION_TYPE:               u32 = 255;
pub const S_LAZY_SYMBOL_POINTERS:     u32 = 7;
pub const S_NON_LAZY_SYMBOL_POINTERS: u32 = 6;

pub const SEG_TEXT:       &[u8; 7]  = b"__TEXT\0";
pub const SEG_DATA:       &[u8; 7]  = b"__DATA\0";
pub const SEG_LINKEDIT:   &[u8; 11] = b"__LINKEDIT\0";
pub const SEG_DATA_CONST: &[u8; 13] = b"__DATA_CONST\0";

#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct load_command {
    pub cmd:     u32,
    pub cmdsize: u32,
}

#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct symtab_command {
    pub cmd:     u32,
    pub cmdsize: u32,
    pub symoff:  u32,
    pub nsyms:   u32,
    pub stroff:  u32,
    pub strsize: u32,
}

#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct dysymtab_command {
    pub cmd:            u32,
    pub cmdsize:        u32,
    pub ilocalsym:      u32,
    pub nlocalsym:      u32,
    pub iextdefsym:     u32,
    pub nextdefsym:     u32,
    pub iundefsym:      u32,
    pub nundefsym:      u32,
    pub tocoff:         u32,
    pub ntoc:           u32,
    pub modtaboff:      u32,
    pub nmodtab:        u32,
    pub extrefsymoff:   u32,
    pub nextrefsyms:    u32,
    pub indirectsymoff: u32,
    pub nindirectsyms:  u32,
    pub extreloff:      u32,
    pub nextrel:        u32,
    pub locreloff:      u32,
    pub nlocrel:        u32,
}

#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct section_64 {
    pub sectname:  [c_char; 16],
    pub segname:   [c_char; 16],
    pub addr:      u64,
    pub size:      u64,
    pub offset:    u32,
    pub align:     u32,
    pub reloff:    u32,
    pub nreloc:    u32,
    pub flags:     u32,
    pub reserved1: u32,
    pub reserved2: u32,
    pub reserved3: u32,
}