From e954723194fe8e5faa9522d94a81a17451300ebc Mon Sep 17 00:00:00 2001 From: tzlil Date: Tue, 21 Feb 2023 22:59:26 +0200 Subject: intial commit, added all structs --- src/structs.rs | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/structs.rs (limited to 'src/structs.rs') diff --git a/src/structs.rs b/src/structs.rs new file mode 100644 index 0000000..c055350 --- /dev/null +++ b/src/structs.rs @@ -0,0 +1,119 @@ +#[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, +} \ No newline at end of file -- cgit 1.4.1