diff --git a/src/ld_so/mod.rs b/src/ld_so/mod.rs index efaf6bc5e98dfd9c0d0e980213513e929d769e57..88a4ce7ebe3939e703e9bc99401c0b306b3ef2f9 100644 --- a/src/ld_so/mod.rs +++ b/src/ld_so/mod.rs @@ -1,3 +1,4 @@ +use core::{mem, ptr}; use goblin::elf::program_header::{self, program_header32, program_header64, ProgramHeader}; use self::tcb::{Master, Tcb}; @@ -11,6 +12,13 @@ mod library; pub mod linker; pub mod start; pub mod tcb; + +static mut STATIC_TCB_MASTER: Master = Master { + ptr: ptr::null_mut(), + len: 0, + offset: 0, +}; + pub fn static_init(sp: &'static Stack) { let mut phdr_opt = None; let mut phent_opt = None; @@ -61,15 +69,14 @@ pub fn static_init(sp: &'static Stack) { ph.p_memsz } as usize; - let tcb_master = Master { - ptr: ph.p_vaddr as usize as *const u8, - len: ph.p_filesz as usize, - offset: vsize - valign, - }; - unsafe { + STATIC_TCB_MASTER.ptr = ph.p_vaddr as usize as *const u8; + STATIC_TCB_MASTER.len = ph.p_filesz as usize; + STATIC_TCB_MASTER.offset = vsize - valign; + let tcb = Tcb::new(vsize).expect("failed to allocate TCB"); - tcb.set_masters(vec![tcb_master].into_boxed_slice()); + tcb.masters_ptr = &mut STATIC_TCB_MASTER; + tcb.masters_len = mem::size_of::<Master>(); tcb.copy_masters().expect("failed to copy TLS master data"); tcb.activate(); }