blob: a4f5e4a0936f4f7d98c5b7c2c8e8f9f629c51381 [file] [log] [blame]
use super::mem;
use crate::slice::from_raw_parts;
const R_X86_64_RELATIVE: u32 = 8;
#[repr(packed)]
struct Rela<T> {
offset: T,
info: T,
addend: T,
}
pub fn relocate_elf_rela() {
unsafe extern "C" {
static RELA: u64;
static RELACOUNT: usize;
}
if unsafe { RELACOUNT } == 0 {
return;
} // unsafe ok: link-time constant
let relas = unsafe {
from_raw_parts::<Rela<u64>>(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) };
}
}