mach_sys/
loader.rs

1//! This module roughly corresponds to `mach-o/loader.h`.
2
3use crate::ffi::{
4    c_char,
5    cpu_type_t,
6    cpu_subtype_t,
7};
8
9#[repr(C)]
10#[allow(dead_code, non_snake_case)]
11#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
12pub struct mach_header {
13    pub magic:      u32,
14    pub cputype:    cpu_type_t,
15    pub cpusubtype: cpu_subtype_t,
16    pub filetype:   u32,
17    pub ncmds:      u32,
18    pub sizeofcmds: u32,
19    pub flags:      u32,
20}
21
22pub const LC_SEGMENT:                 u32 = 1;
23pub const LC_SEGMENT_64:              u32 = 25;
24pub const LC_SYMTAB:                  u32 = 2;
25pub const INDIRECT_SYMBOL_LOCAL:      u32 = 2147483648;
26pub const INDIRECT_SYMBOL_ABS:        u32 = 1073741824;
27pub const SECTION_TYPE:               u32 = 255;
28pub const S_LAZY_SYMBOL_POINTERS:     u32 = 7;
29pub const S_NON_LAZY_SYMBOL_POINTERS: u32 = 6;
30
31pub const SEG_TEXT:       &[u8; 7]  = b"__TEXT\0";
32pub const SEG_DATA:       &[u8; 7]  = b"__DATA\0";
33pub const SEG_LINKEDIT:   &[u8; 11] = b"__LINKEDIT\0";
34pub const SEG_DATA_CONST: &[u8; 13] = b"__DATA_CONST\0";
35
36#[repr(C)]
37#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
38pub struct load_command {
39    pub cmd:     u32,
40    pub cmdsize: u32,
41}
42
43#[repr(C)]
44#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
45pub struct symtab_command {
46    pub cmd:     u32,
47    pub cmdsize: u32,
48    pub symoff:  u32,
49    pub nsyms:   u32,
50    pub stroff:  u32,
51    pub strsize: u32,
52}
53
54#[repr(C)]
55#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
56pub struct dysymtab_command {
57    pub cmd:            u32,
58    pub cmdsize:        u32,
59    pub ilocalsym:      u32,
60    pub nlocalsym:      u32,
61    pub iextdefsym:     u32,
62    pub nextdefsym:     u32,
63    pub iundefsym:      u32,
64    pub nundefsym:      u32,
65    pub tocoff:         u32,
66    pub ntoc:           u32,
67    pub modtaboff:      u32,
68    pub nmodtab:        u32,
69    pub extrefsymoff:   u32,
70    pub nextrefsyms:    u32,
71    pub indirectsymoff: u32,
72    pub nindirectsyms:  u32,
73    pub extreloff:      u32,
74    pub nextrel:        u32,
75    pub locreloff:      u32,
76    pub nlocrel:        u32,
77}
78
79#[repr(C)]
80#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
81pub struct section_64 {
82    pub sectname:  [c_char; 16],
83    pub segname:   [c_char; 16],
84    pub addr:      u64,
85    pub size:      u64,
86    pub offset:    u32,
87    pub align:     u32,
88    pub reloff:    u32,
89    pub nreloc:    u32,
90    pub flags:     u32,
91    pub reserved1: u32,
92    pub reserved2: u32,
93    pub reserved3: u32,
94}
95