]> git.lizzy.rs Git - rust.git/blob - src/libstd/sys/sgx/abi/reloc.rs
a39841bc36f537939d85aa7f5a1628388b7e6861
[rust.git] / src / libstd / sys / sgx / abi / reloc.rs
1 use crate::slice::from_raw_parts;
2 use super::mem;
3
4 const R_X86_64_RELATIVE: u32 = 8;
5
6 #[repr(packed)]
7 struct Rela<T> {
8     offset: T,
9     info: T,
10     addend: T,
11 }
12
13 pub fn relocate_elf_rela() {
14     extern {
15         static RELA: u64;
16         static RELACOUNT: usize;
17     }
18
19     if unsafe { RELACOUNT } == 0 { return }  // unsafe ok: link-time constant
20
21     let relas = unsafe {
22         from_raw_parts::<Rela<u64>>(mem::rel_ptr(RELA), RELACOUNT)  // unsafe ok: link-time constant
23     };
24     for rela in relas {
25         if rela.info != (/*0 << 32 |*/ R_X86_64_RELATIVE as u64) {
26             panic!("Invalid relocation");
27         }
28         unsafe { *mem::rel_ptr_mut::<*const ()>(rela.offset) = mem::rel_ptr(rela.addend) };
29     }
30 }