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
|
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct ElfIdent {
/// Magic number - 0x7F, then 'ELF' in ASCII
pub magic: [u8; 4],
/// 1 = 32 bit, 2 = 64 bit
pub class: Class,
// 1 = little endian, 2 = big endian
pub data: Endian,
/// ELF header version
pub version: u8,
/// OS ABI - usually 0 for System V
pub OSABI: OSABI,
// This field is used to distinguish among incompatible versions of an ABI.
pub ABIVersion: u8,
/// Unused/padding
pub _unused: [u8; 7],
}
// https://man7.org/linux/man-pages/man5/elf.5.html
// https://wiki.osdev.org/ELF
// https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
#[repr(C, packed)]
#[derive(Debug)]
pub struct ElfHeader {
pub ident: ElfIdent,
/// 1 = relocatable, 2 = executable, 3 = shared, 4 = core
pub r#type: Type,
/// Instruction set - see table below
pub machine: Machine,
/// ELF Version
pub version: u32,
/// Program entry position (virtual)
pub entry: u64,
/// Program header table position (bytes into file)
pub phoff: u64,
/// Section header table position (bytes into file)
pub shoff: u64,
/// This member holds processor-specific flags associated with the file
/// Currently, no flags have been defined.
pub flags: u32,
/// Header size
pub ehsize: u16,
/// Size of an entry in the program header table
pub phentsize: u16,
/// Number of entries in the program header table
pub phnum: u16,
/// Size of an entry in the section header table
pub shentsize: u16,
/// Number of entries in the section header table
pub shnum: u16,
/// Index in section header table with the section names
pub shstrndx: u16,
}
#[derive(Debug, Copy, Clone)]
#[repr(u16)]
pub enum Type {
None = 0,
Rel = 1,
Exec = 2,
Dyn = 3,
Core = 4,
}
#[derive(Debug, Copy, Clone)]
#[repr(u16)]
pub enum Machine {
None = 1,
X86_64 = 62,
}
#[derive(Debug, Copy, Clone)]
#[repr(u8)]
pub enum Class {
ELF32 = 1,
ELF64 = 2,
}
#[derive(Debug, Copy, Clone)]
#[repr(u8)]
pub enum OSABI {
None = 0x00,
SystemV = 0x01,
HPUX = 0x02,
Solaris = 0x03,
IRIX = 0x04,
FreeBSD = 0x05,
TRU64 = 0x06,
ARM = 0x07,
Standalone = 0x08,
}
#[derive(Debug, Copy, Clone)]
#[repr(u8)]
pub enum Endian {
Little = 1,
Big = 2,
}
|