diff --git a/src/start.rs b/src/start.rs
index ade155b9659be5bfadd681764e7ed469bd9e38bf..3dd856f59fd54a2d3b718111cfc6a78b0841faad 100644
--- a/src/start.rs
+++ b/src/start.rs
@@ -60,6 +60,24 @@ pub unsafe fn relibc_verify_host() {
         intrinsics::abort();
     }
 }
+#[link_section = ".init_array"]
+#[used]
+static INIT_ARRAY: [extern "C" fn(); 1] = [init_array];
+
+static mut init_complete: bool = false;
+
+extern "C" fn init_array() {
+    io_init();
+    unsafe { init_complete = true };
+}
+fn io_init() {
+    unsafe {
+        // Initialize stdin/stdout/stderr, see https://github.com/rust-lang/rust/issues/51718
+        stdio::stdin = stdio::default_stdin.get();
+        stdio::stdout = stdio::default_stdout.get();
+        stdio::stderr = stdio::default_stderr.get();
+    }
+}
 
 #[inline(never)]
 #[no_mangle]
@@ -95,11 +113,9 @@ 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();
 
-    // Initialize stdin/stdout/stderr, see https://github.com/rust-lang/rust/issues/51718
-    stdio::stdin = stdio::default_stdin.get();
-    stdio::stdout = stdio::default_stdout.get();
-    stdio::stderr = stdio::default_stderr.get();
-
+    if !init_complete {
+        init_array();
+    }
     pthread_init();
 
     // Run preinit array