monistode_binutils/executable/
header.rs

1use 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, // TODO search for start symbol
49        }
50    }
51}