diff --git a/src/ld_so/start.rs b/src/ld_so/start.rs index 4a395ffec4377e14c217b935259d44362552f224..b19b4ac414b5a031685fe192d3f0a5c76697fbf8 100644 --- a/src/ld_so/start.rs +++ b/src/ld_so/start.rs @@ -17,7 +17,7 @@ use crate::{ ALLOCATOR, }; -use super::{access::accessible, debug::_r_debug, linker::Linker, tcb::Tcb, PATH_SEP}; +use super::{access::accessible, debug::_r_debug, linker::Linker, tcb::Tcb, ExpectTlsFree, PATH_SEP}; use crate::header::sys_auxv::{AT_ENTRY, AT_PHDR}; use goblin::elf::header::header64::SIZEOF_EHDR; @@ -213,6 +213,12 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack, ld_entry: usize) -> } }; + // Ensure there is a stub Tcb + unsafe { + let tcb = Tcb::new(0).expect_notls("failed to allocate TCB"); + tcb.activate(); + } + // if we are not running in manual mode, then the main // program is already loaded by the kernel and we want // to use it. on redox, we treat it the same.