From 58cc9efbc0d11d9e3d659c28067777f8bc7f56d5 Mon Sep 17 00:00:00 2001
From: Mateusz Tabaka <tab.debugteam@gmail.com>
Date: Tue, 29 Sep 2020 19:20:24 +0200
Subject: [PATCH] Call pthread_init in libc's init_array

---
 src/start.rs | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/start.rs b/src/start.rs
index d001d9dde..2082dc84e 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
     {
-- 
GitLab