diff --git a/risc_v/src/elf.rs b/risc_v/src/elf.rs new file mode 100755 index 0000000..d0c8712 --- /dev/null +++ b/risc_v/src/elf.rs @@ -0,0 +1,60 @@ +// elf.rs +// Routines for reading and parsing ELF +// (Executable and Linkable Format) files. +// 26-April-2020 +// Stephen Marz + + +// Every ELF file starts with ELF "magic", which is a sequence of four bytes 0x7f followed by capital ELF, which is 0x45, 0x4c, and 0x46 respectively. +pub const MAGIC: u32 = 0x464c_457f; + +/// The ELF header contains information about placement and numbers of the important sections within our file. +#[repr(C)] +pub struct Header { + pub magic: u32, + pub bitsize: u8, + pub endian: u8, + pub ident_abi_version: u8, + pub target_platform: u8, + pub abi_version: u8, + pub padding: [u8; 7], + pub obj_type: u16, + pub machine: u16, // 0xf3 for RISC-V + pub version: u32, + pub entry_addr: usize, + pub phoff: usize, + pub shoff: usize, + pub flags: u32, + pub ehsize: u16, + pub phentsize: u16, + pub phnum: u16, + pub shentsize: u16, + pub shnum: u16, + pub shstrndx: u16, +} + +#[repr(C)] +pub struct ProgramHeader { + pub seg_type: u32, + pub flags: u32, + pub off: usize, + pub vaddr: usize, + pub paddr: usize, + pub filesz: usize, + pub memsz: usize, + pub align: usize, +} + +pub const TYPE_EXEC: u16 = 2; + +pub const PROG_READ: u8 = 4; +pub const PROG_WRITE: u8 = 2; +pub const PROG_EXECUTE: u8 = 1; + +pub const MACHINE_RISCV: u16 = 0xf3; +pub const PH_SEG_TYPE_NULL: u32 = 0; +pub const PH_SEG_TYPE_LOAD: u32 = 1; +pub const PH_SEG_TYPE_DYNAMIC: u32 = 2; +pub const PH_SEG_TYPE_INTERP: u32 = 3; +pub const PH_SEG_TYPE_NOTE: u32 = 4; +