summary refs log tree commit diff
path: root/src/structs.rs
blob: c0553503d8668635d7cc4a63aa97fef3777e25f1 (plain)
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,
}