use super::consts::{
ELFCLASS32, ELFCLASS64, EM_386, EM_AARCH64, EM_ARM, EM_IAMCU, EM_LOONGARCH, EM_PPC64, EM_RISCV,
EM_S390, EM_X86_64,
};
use crate::target::Architecture;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct FileHeader {
pub class: u8,
pub data: u8,
pub ident_version: u8,
pub os_abi: u8,
pub abi_version: u8,
pub e_type: u16,
pub e_machine: u16,
pub e_version: u32,
pub e_entry: u64,
pub e_phoff: u64,
pub e_shoff: u64,
pub e_flags: u32,
pub e_ehsize: u16,
pub e_phentsize: u16,
pub e_phnum: u16,
pub e_shentsize: u16,
pub e_shnum: u16,
pub e_shstrndx: u16,
}
impl FileHeader {
#[must_use]
pub fn architecture(&self) -> Option<Architecture> {
architecture(self.e_machine, self.class)
}
}
#[must_use]
pub fn architecture(e_machine: u16, class: u8) -> Option<Architecture> {
match (e_machine, class) {
(EM_X86_64, ELFCLASS64) => Some(Architecture::X86_64),
(EM_X86_64, ELFCLASS32) => Some(Architecture::X86_64X32),
(EM_386 | EM_IAMCU, ELFCLASS32) => Some(Architecture::X86),
(EM_AARCH64, ELFCLASS64) => Some(Architecture::Aarch64),
(EM_ARM, ELFCLASS32) => Some(Architecture::Arm),
(EM_RISCV, ELFCLASS64) => Some(Architecture::Riscv64),
(EM_RISCV, ELFCLASS32) => Some(Architecture::Riscv32),
(EM_PPC64, ELFCLASS64) => Some(Architecture::PowerPc64),
(EM_LOONGARCH, ELFCLASS64) => Some(Architecture::LoongArch64),
(EM_S390, ELFCLASS64) => Some(Architecture::S390x),
_ => None,
}
}