use crate::{Error, Loader, Source};
#[derive(Debug, Clone)]
pub struct Header {
p_type: u32,
p_offset: u32,
p_vaddr: u32,
p_paddr: u32,
p_filesz: u32,
p_memsz: u32,
p_flags: u32,
p_align: u32,
}
impl Header {
pub const SIZE_IN_BYTES: u16 = 0x20;
pub const PT_NULL: u32 = 0x00000000;
pub const PT_LOAD: u32 = 0x00000001;
pub const PT_DYNAMIC: u32 = 0x00000002;
pub const PT_INTERP: u32 = 0x00000003;
pub const PT_NOTE: u32 = 0x00000004;
pub const PT_SHLIB: u32 = 0x00000005;
pub const PT_PHDR: u32 = 0x00000006;
pub const PT_TLS: u32 = 0x00000007;
pub const PT_GNU_STACK: u32 = 0x6474E551;
pub fn new<DS>(loader: &Loader<DS>, idx: u16) -> Result<Self, Error<DS::Error>>
where
DS: Source,
{
let ph_table_offset = loader.e_phoff + u32::from(Self::SIZE_IN_BYTES) * u32::from(idx);
let p_type = loader.data_source.read_u32_le(ph_table_offset)?;
let p_offset = loader.data_source.read_u32_le(ph_table_offset + 0x04)?;
let p_vaddr = loader.data_source.read_u32_le(ph_table_offset + 0x08)?;
let p_paddr = loader.data_source.read_u32_le(ph_table_offset + 0x0C)?;
let p_filesz = loader.data_source.read_u32_le(ph_table_offset + 0x10)?;
let p_memsz = loader.data_source.read_u32_le(ph_table_offset + 0x14)?;
let p_flags = loader.data_source.read_u32_le(ph_table_offset + 0x18)?;
let p_align = loader.data_source.read_u32_le(ph_table_offset + 0x1C)?;
Ok(Self {
p_type,
p_offset,
p_vaddr,
p_paddr,
p_filesz,
p_memsz,
p_flags,
p_align,
})
}
pub fn p_type(&self) -> u32 {
self.p_type
}
pub fn p_offset(&self) -> u32 {
self.p_offset
}
pub fn p_vaddr(&self) -> u32 {
self.p_vaddr
}
pub fn p_paddr(&self) -> u32 {
self.p_paddr
}
pub fn p_filesz(&self) -> u32 {
self.p_filesz
}
pub fn p_memsz(&self) -> u32 {
self.p_memsz
}
pub fn p_flags(&self) -> u32 {
self.p_flags
}
pub fn p_align(&self) -> u32 {
self.p_align
}
}