diff --git a/elven-forest/src/main.rs b/elven-forest/src/main.rs index 8b329df..02b5a6b 100644 --- a/elven-forest/src/main.rs +++ b/elven-forest/src/main.rs @@ -188,7 +188,7 @@ fn print_file(path: &str) -> anyhow::Result<()> { let symbol = sym_display_name(elf, sym)?; - let offset = Addr(rela.offset.0); + let offset = rela.offset; let r#type = c::RX86_64(rela.info.r#type()); let addend = rela.addend; diff --git a/elven-parser/src/addrs.rs b/elven-parser/src/addrs.rs new file mode 100644 index 0000000..2d90872 --- /dev/null +++ b/elven-parser/src/addrs.rs @@ -0,0 +1,64 @@ +use std::{ + fmt::{Debug, Display}, + ops::Add, +}; + +use crate::idx::ToIdxUsize; +use bytemuck::{Pod, Zeroable}; + +/// A _run time_ address inside an object file. +#[derive(Clone, Copy, PartialEq, Eq, Hash, Zeroable, Pod)] +#[repr(transparent)] +pub struct Addr { + value: u64, +} + +#[allow(non_snake_case)] +pub const fn Addr(value: u64) -> Addr { + Addr { value } +} + +impl Debug for Addr { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "0x{:x}", self.value) + } +} + +impl Display for Addr { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "0x{:x}", self.value) + } +} + +impl Add for Addr { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + self + rhs.value + } +} + +impl Add for Addr { + type Output = Self; + + fn add(self, rhs: u64) -> Self::Output { + Addr(self.value + rhs) + } +} + +/// An offset into an object file. Either absolut or relative to a particular section. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Zeroable, Pod)] +#[repr(transparent)] +pub struct Offset(pub u64); + +impl ToIdxUsize for Offset { + fn to_idx_usize(self) -> usize { + self.0.to_idx_usize() + } +} + +impl Display for Offset { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "0x{:x}", self.0) + } +} diff --git a/elven-parser/src/lib.rs b/elven-parser/src/lib.rs index 095c7ec..0bde8a9 100644 --- a/elven-parser/src/lib.rs +++ b/elven-parser/src/lib.rs @@ -1,45 +1,9 @@ #![allow(clippy::must_use_candidate, clippy::missing_errors_doc)] -use std::fmt::{Debug, Display}; - -use bytemuck::{Pod, Zeroable}; -use idx::ToIdxUsize; - +mod addrs; pub mod consts; mod idx; pub mod read; pub mod write; -/// A _run time_ address inside an object file. -#[derive(Clone, Copy, PartialEq, Eq, Hash, Zeroable, Pod)] -#[repr(transparent)] -pub struct Addr(pub u64); - -impl Debug for Addr { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "0x{:x}", self.0) - } -} - -impl Display for Addr { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "0x{:x}", self.0) - } -} - -/// An offset into an object file. Either absolut or relative to a particular section. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Zeroable, Pod)] -#[repr(transparent)] -pub struct Offset(pub u64); - -impl ToIdxUsize for Offset { - fn to_idx_usize(self) -> usize { - self.0.to_idx_usize() - } -} - -impl Display for Offset { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "0x{:x}", self.0) - } -} +pub use crate::addrs::{Addr, Offset}; diff --git a/elven-wald/src/lib.rs b/elven-wald/src/lib.rs index 3e551bd..0bda0d1 100644 --- a/elven-wald/src/lib.rs +++ b/elven-wald/src/lib.rs @@ -59,7 +59,7 @@ pub fn run(opts: Opts) -> Result<()> { let _start_sym = elf.symbol_by_name(b"_start")?; - write_output(text_content, _start_sym.value.0)?; + write_output(text_content, _start_sym.value)?; Ok(()) } @@ -67,7 +67,7 @@ pub fn run(opts: Opts) -> Result<()> { pub const BASE_EXEC_ADDR: Addr = Addr(0x400000); // whatever ld does pub const DEFAULT_PROGRAM_HEADER_ALIGN_THAT_LD_USES_HERE: u64 = 0x1000; -fn write_output(text: &[u8], entry_offset_from_text: u64) -> Result<()> { +fn write_output(text: &[u8], entry_offset_from_text: Addr) -> Result<()> { let ident = ElfIdent { magic: *c::ELFMAG, class: c::Class(c::ELFCLASS64), @@ -112,9 +112,8 @@ fn write_output(text: &[u8], entry_offset_from_text: u64) -> Result<()> { write.add_program_header(elf_header_and_program_headers); - let entry_addr = Addr( - BASE_EXEC_ADDR.0 + DEFAULT_PROGRAM_HEADER_ALIGN_THAT_LD_USES_HERE + entry_offset_from_text, - ); + let entry_addr = + BASE_EXEC_ADDR + DEFAULT_PROGRAM_HEADER_ALIGN_THAT_LD_USES_HERE + entry_offset_from_text; let text_program_header = ProgramHeader { r#type: PT_LOAD.into(),