diff options
author | pommicket <pommicket@gmail.com> | 2022-10-31 10:58:44 -0400 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2022-10-31 10:58:44 -0400 |
commit | d8c24fe3a6b2b7291368ca939b6c38acca2c499a (patch) | |
tree | e012caec7a40e04423366097de7f13aa8ecdbab0 /src/elf.rs | |
parent | 199de26167409976debb57d12a894c3d403dbb83 (diff) |
start writing executable
Diffstat (limited to 'src/elf.rs')
-rw-r--r-- | src/elf.rs | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/elf.rs b/src/elf.rs new file mode 100644 index 0000000..aa9b3f5 --- /dev/null +++ b/src/elf.rs @@ -0,0 +1,121 @@ +// basic ELF types and constants + +use std::{io, mem}; + +pub const ET_REL: u16 = 1; +pub const ET_EXEC: u16 = 2; + +#[repr(C)] +pub struct Header32 { + pub ident: [u8; 4], + pub class: u8, + pub data: u8, + pub version: u8, + pub abi: u8, + pub abiversion: u8, + pub pad: [u8; 7], + pub r#type: u16, + pub machine: u16, + pub version2: u32, + pub entry: u32, + pub phoff: u32, + pub shoff: u32, + pub flags: u32, + pub ehsize: u16, + pub phentsize: u16, + pub phnum: u16, + pub shentsize: u16, + pub shnum: u16, + pub shstrndx: u16, +} + +impl Default for Header32 { + fn default() -> Self { + Self { + ident: [0x7F, b'E', b'L', b'F'], + class: 1, + data: 1, + version: 1, + abi: 0, + abiversion: 0, + pad: [0; 7], + r#type: ET_EXEC, + machine: 3, + version2: 1, + entry: 0, + phoff: 0, + shoff: 0, + flags: 0, + ehsize: mem::size_of::<Self>() as _, + phentsize: mem::size_of::<Phdr32>() as _, + phnum: 0, + shentsize: mem::size_of::<Shdr32>() as _, + shnum: 0, + shstrndx: 0, + } + } +} + +impl Header32 { + pub fn section_offset(&self, ndx: u16) -> u64 { + ndx as u64 * self.shentsize as u64 + self.shoff as u64 + } + + pub fn section_seek(&self, ndx: u16) -> io::SeekFrom { + io::SeekFrom::Start(self.section_offset(ndx)) + } + + pub fn to_bytes(self) -> [u8; 0x34] { + unsafe { mem::transmute(self) } + } +} + +#[repr(C)] +#[derive(Clone)] +pub struct Shdr32 { + pub name: u32, + pub r#type: u32, + pub flags: u32, + pub addr: u32, + pub offset: u32, + pub size: u32, + pub link: u32, + pub info: u32, + pub addralign: u32, + pub entsize: u32, +} + +pub const PT_LOAD: u32 = 0; + +#[repr(C)] +pub struct Phdr32 { + pub r#type: u32, + pub offset: u32, + pub vaddr: u32, + pub paddr: u32, + pub filesz: u32, + pub memsz: u32, + pub flags: u32, + pub align: u32, +} + +impl Default for Phdr32 { + fn default() -> Self { + Self { + r#type: PT_LOAD, + offset: 0, + vaddr: 0, + paddr: 0, + filesz: 0, + memsz: 0, + flags: 0, + align: 0x1000, + } + } +} + +impl Phdr32 { + pub fn to_bytes(self) -> [u8; 0x20] { + unsafe { mem::transmute(self) } + } +} |