#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct BaseRelocation {
pub virtual_address: u32,
pub size_of_block: u32,
}
impl BaseRelocation {
pub fn entry_count(&self) -> usize {
if self.size_of_block <= 8 {
0
} else {
((self.size_of_block - 8) / 2) as usize
}
}
}
#[repr(transparent)]
#[derive(Debug, Clone, Copy)]
pub struct RelocationEntry(pub u16);
impl RelocationEntry {
pub fn reloc_type(&self) -> u8 {
(self.0 >> 12) as u8
}
pub fn offset(&self) -> u16 {
self.0 & 0x0FFF
}
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RelocationType {
Absolute = 0, High = 1, Low = 2, HighLow = 3, HighAdj = 4, Dir64 = 10, }
impl From<u8> for RelocationType {
fn from(val: u8) -> Self {
match val {
0 => Self::Absolute,
1 => Self::High,
2 => Self::Low,
3 => Self::HighLow,
4 => Self::HighAdj,
10 => Self::Dir64,
_ => Self::Absolute, }
}
}