#[repr(C, packed)] #[derive(Debug, Copy, Clone)] pub struct ElfIdent { /// Magic number - 0x7F, then 'ELF' in ASCII pub magic: [u8; 4], /// 1 = 32 bit, 2 = 64 bit pub class: Class, // 1 = little endian, 2 = big endian pub data: Endian, /// ELF header version pub version: u8, /// OS ABI - usually 0 for System V pub OSABI: OSABI, // This field is used to distinguish among incompatible versions of an ABI. pub ABIVersion: u8, /// Unused/padding pub _unused: [u8; 7], } // https://man7.org/linux/man-pages/man5/elf.5.html // https://wiki.osdev.org/ELF // https://en.wikipedia.org/wiki/Executable_and_Linkable_Format #[repr(C, packed)] #[derive(Debug)] pub struct ElfHeader { pub ident: ElfIdent, /// 1 = relocatable, 2 = executable, 3 = shared, 4 = core pub r#type: Type, /// Instruction set - see table below pub machine: Machine, /// ELF Version pub version: u32, /// Program entry position (virtual) pub entry: u64, /// Program header table position (bytes into file) pub phoff: u64, /// Section header table position (bytes into file) pub shoff: u64, /// This member holds processor-specific flags associated with the file /// Currently, no flags have been defined. pub flags: u32, /// Header size pub ehsize: u16, /// Size of an entry in the program header table pub phentsize: u16, /// Number of entries in the program header table pub phnum: u16, /// Size of an entry in the section header table pub shentsize: u16, /// Number of entries in the section header table pub shnum: u16, /// Index in section header table with the section names pub shstrndx: u16, } #[derive(Debug, Copy, Clone)] #[repr(u16)] pub enum Type { None = 0, Rel = 1, Exec = 2, Dyn = 3, Core = 4, } #[derive(Debug, Copy, Clone)] #[repr(u16)] pub enum Machine { None = 1, X86_64 = 62, } #[derive(Debug, Copy, Clone)] #[repr(u8)] pub enum Class { ELF32 = 1, ELF64 = 2, } #[derive(Debug, Copy, Clone)] #[repr(u8)] pub enum OSABI { None = 0x00, SystemV = 0x01, HPUX = 0x02, Solaris = 0x03, IRIX = 0x04, FreeBSD = 0x05, TRU64 = 0x06, ARM = 0x07, Standalone = 0x08, } #[derive(Debug, Copy, Clone)] #[repr(u8)] pub enum Endian { Little = 1, Big = 2, }