elf_utilities/header/
elf32.rs1use crate::header::{class, data, elf_type, machine, osabi, version};
2use crate::*;
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Copy, Hash, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize)]
6#[repr(C)]
7pub struct Ehdr32 {
8 pub e_ident: [u8; 16],
9 pub e_type: Elf32Half,
10 pub e_machine: Elf32Half,
11 pub e_version: Elf32Word,
12 pub e_entry: Elf32Addr,
13 pub e_phoff: Elf32Off,
14 pub e_shoff: Elf32Off,
15 pub e_flags: Elf32Word,
16 pub e_ehsize: Elf32Half,
17 pub e_phentsize: Elf32Half,
18 pub e_phnum: Elf32Half,
19 pub e_shentsize: Elf32Half,
20 pub e_shnum: Elf32Half,
21 pub e_shstrndx: Elf32Half,
22}
23
24impl Default for Ehdr32 {
25 fn default() -> Self {
26 Self {
27 e_ident: [
28 0x7f, 0x45, 0x4c, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
29 0x00, 0x00,
30 ],
31 e_type: 0,
32 e_machine: 0,
33 e_version: 0,
34 e_entry: 0,
35 e_phoff: 0,
36 e_shoff: 0,
37 e_flags: 0,
38 e_ehsize: 0,
39 e_phentsize: 0,
40 e_phnum: 0,
41 e_shentsize: 0,
42 e_shnum: 0,
43 e_shstrndx: 0,
44 }
45 }
46}
47
48impl Ehdr32 {
49 pub const SIZE: Elf32Half = 52;
50
51 pub fn get_class(&self) -> class::Class {
52 class::Class::from(self.e_ident[class::Class::INDEX])
53 }
54 pub fn get_data(&self) -> data::Data {
55 data::Data::from(self.e_ident[data::Data::INDEX])
56 }
57 pub fn get_file_version(&self) -> version::Version {
58 version::Version::from(self.e_ident[version::Version::INDEX])
59 }
60 pub fn get_object_version(&self) -> version::Version {
61 version::Version::from(self.e_version)
62 }
63 pub fn get_type(&self) -> elf_type::Type {
64 elf_type::Type::from(self.e_type)
65 }
66 pub fn get_machine(&self) -> machine::Machine {
67 machine::Machine::from(self.e_machine)
68 }
69 pub fn get_osabi(&self) -> osabi::OSABI {
70 osabi::OSABI::from(self.e_ident[osabi::OSABI::INDEX])
71 }
72 pub fn set_class(&mut self, c: class::Class) {
73 self.e_ident[class::Class::INDEX] = c.to_identifier();
74 }
75 pub fn set_data(&mut self, d: data::Data) {
76 self.e_ident[data::Data::INDEX] = d.to_identifier();
77 }
78 pub fn set_file_version(&mut self, v: version::Version) {
79 self.e_ident[version::Version::INDEX] = v.to_identifier();
80 }
81 pub fn set_object_version(&mut self, v: version::Version) {
82 self.e_version = v.to_object_version();
83 }
84 pub fn set_osabi(&mut self, o: osabi::OSABI) {
85 self.e_ident[osabi::OSABI::INDEX] = o.to_identifier();
86 }
87 pub fn set_elf_type(&mut self, e_type: elf_type::Type) {
88 self.e_type = e_type.to_bytes();
89 }
90 pub fn set_machine(&mut self, e_machine: machine::Machine) {
91 self.e_machine = e_machine.to_bytes();
92 }
93
94 pub fn to_le_bytes(&self) -> Vec<u8> {
96 bincode::serialize(self).unwrap()
97 }
98
99 pub fn deserialize(buf: &[u8], start: usize) -> Result<Self, Box<dyn std::error::Error>> {
100 match bincode::deserialize(&buf[start..]) {
102 Ok(header) => Ok(header),
103 Err(e) => Err(e),
104 }
105 }
106}