monistode_binutils/executable/
header.rs1use crate::serializable::*;
2
3#[derive(Debug, Clone)]
4pub struct ExecutableHeader {
5 pub(crate) architecture: Architecture,
6 pub(crate) segment_count: u64,
7 pub(crate) entry_point: u64,
8}
9
10impl Serializable for ExecutableHeader {
11 fn serialize(&self) -> Vec<u8> {
12 let mut data = Vec::new();
13 data.push(self.architecture as u8);
14 data.extend(self.segment_count.to_le_bytes());
15 data.extend(self.entry_point.to_le_bytes());
16 data
17 }
18
19 fn deserialize(data: &[u8]) -> Result<(usize, Self), SerializationError> {
20 if data.len() < 17 {
21 return Err(SerializationError::DataTooShort);
22 }
23
24 let architecture = Architecture::try_from(data[0])?;
25 let segment_count = u64::from_le_bytes([
26 data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8],
27 ]);
28 let entry_point = u64::from_le_bytes([
29 data[9], data[10], data[11], data[12], data[13], data[14], data[15], data[16],
30 ]);
31
32 Ok((
33 17,
34 ExecutableHeader {
35 architecture,
36 segment_count,
37 entry_point,
38 },
39 ))
40 }
41}
42
43impl ExecutableHeader {
44 pub fn new(architecture: Architecture, segment_count: u64) -> Self {
45 ExecutableHeader {
46 architecture,
47 segment_count,
48 entry_point: 0, }
50 }
51}