monistode_binutils/executable/segments/
header.rs

1use crate::{Serializable, SerializationError};
2
3use super::flags::SegmentFlags;
4
5#[derive(Debug, Clone)]
6pub struct SegmentHeader {
7    pub address_space_start: u64, // These are the addresses - in bytes
8    pub address_space_size: u64,
9    pub disk_bit_count: usize,
10    pub flags: SegmentFlags,
11}
12
13impl Serializable for SegmentHeader {
14    fn serialize(&self) -> Vec<u8> {
15        let mut data = Vec::new();
16        data.extend(self.address_space_start.to_le_bytes());
17        data.extend(self.address_space_size.to_le_bytes());
18        data.extend((self.disk_bit_count as u64).to_le_bytes());
19        data.extend(self.flags.serialize());
20        data
21    }
22
23    fn deserialize(data: &[u8]) -> Result<(usize, Self), SerializationError> {
24        if data.len() < 24 {
25            return Err(SerializationError::DataTooShort);
26        }
27        let address_space_start = u64::from_le_bytes([
28            data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7],
29        ]);
30        let address_space_size = u64::from_le_bytes([
31            data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15],
32        ]);
33        let disk_bit_count = u64::from_le_bytes([
34            data[16], data[17], data[18], data[19], data[20], data[21], data[22], data[23],
35        ]) as usize;
36        let (flags_size, flags) = SegmentFlags::deserialize(&data[24..])?;
37        return Ok((
38            24 + flags_size,
39            SegmentHeader {
40                address_space_start,
41                address_space_size,
42                disk_bit_count,
43                flags,
44            },
45        ));
46    }
47}
48
49impl SegmentHeader {
50    pub fn segment_size(&self) -> usize {
51        (self.disk_bit_count + 7) / 8
52    }
53}