mod elf_type;
pub use elf_type::*;
mod machine;
pub use machine::*;
mod class;
pub use class::*;
mod data;
pub use data::*;
#[derive(Default)]
pub struct Elf64Header {
pub ident: ElfIdentification,
pub elf_type: ElfType,
pub machine: ElfMachine,
pub version: Elf64Word,
pub entry: Elf64Addr,
pub phoff: Elf64Off,
pub shoff: Elf64Off,
pub flags: Elf64Word,
pub ehsize: Elf64Half,
pub phentsize: Elf64Half,
pub phnum: Elf64Half,
pub shentsize: Elf64Half,
pub shnum: Elf64Half,
pub shstrndx: Elf64Half,
}
impl From<RawElf64Header> for Elf64Header {
fn from(raw: RawElf64Header) -> Self {
Self {
ident: ElfIdentification::from(raw.e_ident),
elf_type: ElfType::from(raw.e_type),
machine: ElfMachine::from(raw.e_machine),
version: raw.e_version,
entry: raw.e_entry,
phoff: raw.e_phoff,
shoff: raw.e_shoff,
flags: raw.e_flags,
ehsize: raw.e_ehsize,
phentsize: raw.e_phentsize,
phnum: raw.e_phnum,
shentsize: raw.e_shentsize,
shnum: raw.e_shnum,
shstrndx: raw.e_shstrndx,
}
}
}
#[derive(Default)]
pub struct RawElf64Header {
pub e_ident: RawElfIdentification,
pub e_type: Elf64Half,
pub e_machine: Elf64Half,
pub e_version: Elf64Word,
pub e_entry: Elf64Addr,
pub e_phoff: Elf64Off,
pub e_shoff: Elf64Off,
pub e_flags: Elf64Word,
pub e_ehsize: Elf64Half,
pub e_phentsize: Elf64Half,
pub e_phnum: Elf64Half,
pub e_shentsize: Elf64Half,
pub e_shnum: Elf64Half,
pub e_shstrndx: Elf64Half,
}
#[derive(Default)]
pub struct ElfIdentification {
pub class: ElfClass,
pub data: ElfData,
pub version: u8,
}
impl From<RawElfIdentification> for ElfIdentification {
fn from(raw: RawElfIdentification) -> Self {
Self {
class: ElfClass::from(raw.e_class),
data: ElfData::from(raw.e_data),
version: raw.e_version,
}
}
}
pub struct RawElfIdentification {
pub e_magic: [u8; ELF_MAGICNUMBER_FIELD_LENGTH],
pub e_class: u8,
pub e_data: u8,
pub e_version: u8,
pub e_padding: [u8; ELF_IDENT_PADDING_FIELD_LENGTH],
}
impl Default for RawElfIdentification {
fn default() -> Self {
Self {
e_magic: [0x00; ELF_MAGICNUMBER_FIELD_LENGTH],
e_class: 0,
e_data: 0,
e_version: 0,
e_padding: [0x00; ELF_IDENT_PADDING_FIELD_LENGTH],
}
}
}
mod magicnumber {
pub const ELF_MAGICNUMBER_SIGNATURE: [u8; 4] = [0x7f, 0x45, 0x4c, 0x46];
pub const ELF_MAGICNUMBER_FIELD_LENGTH: usize = 4;
pub const ELF_IDENT_MAGICNUMBER0_INDEX: usize = 0;
pub const ELF_IDENT_MAGICNUMBER1_INDEX: usize = 1;
pub const ELF_IDENT_MAGICNUMBER2_INDEX: usize = 2;
pub const ELF_IDENT_MAGICNUMBER3_INDEX: usize = 3;
}
pub use magicnumber::*;
use crate::{Elf64Addr, Elf64Half, Elf64Off, Elf64Word};
pub const ELF_IDENT_VERSION_INDEX: usize = 6;
pub const ELF_IDENT_PADDING_INDEX: usize = 7;
pub const ELF_IDENT_PADDING_FIELD_LENGTH: usize = 9;