monistode_binutils/executable/segments/
header.rs1use crate::{Serializable, SerializationError};
2
3use super::flags::SegmentFlags;
4
5#[derive(Debug, Clone)]
6pub struct SegmentHeader {
7 pub address_space_start: u64, 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}