diff --git a/src/start.rs b/src/start.rs index d001d9dde0aaaa7b74a06512eb29ce3d7c4a2375..2082dc84efa8f3d18c7fdfe7a5a6b5f371595381 100644 --- a/src/start.rs +++ b/src/start.rs @@ -86,9 +86,23 @@ extern "C" fn init_array() { // init_array runs first or if relibc_start runs first // Still whoever gets to run first must initialize rust // memory allocator before doing anything else. + + unsafe { + if init_complete { + return; + } + } + alloc_init(); io_init(); - unsafe { init_complete = true }; + + extern "C" { + fn pthread_init(); + } + unsafe { + pthread_init(); + init_complete = true + } } fn io_init() { unsafe { @@ -108,7 +122,6 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! { static __init_array_start: extern "C" fn(); static __init_array_end: extern "C" fn(); - fn pthread_init(); fn _init(); fn main(argc: isize, argv: *mut *mut c_char, envp: *mut *mut c_char) -> c_int; } @@ -138,10 +151,7 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! { platform::inner_environ = copy_string_array(envp, len); platform::environ = platform::inner_environ.as_mut_ptr(); - if !init_complete { - init_array(); - } - pthread_init(); + init_array(); // Run preinit array {