use super::mem; use crate::slice::from_raw_parts; const R_X86_64_RELATIVE: u32 = 8; #[repr(packed)] struct Rela { offset: T, info: T, addend: T, } pub fn relocate_elf_rela() { extern "C" { static RELA: u64; static RELACOUNT: usize; } if unsafe { RELACOUNT } == 0 { return; } // unsafe ok: link-time constant let relas = unsafe { from_raw_parts::>(mem::rel_ptr(RELA), RELACOUNT) // unsafe ok: link-time constant }; for rela in relas { if rela.info != (/*0 << 32 |*/R_X86_64_RELATIVE as u64) { rtabort!("Invalid relocation"); } unsafe { *mem::rel_ptr_mut::<*const ()>(rela.offset) = mem::rel_ptr(rela.addend) }; } }