diff --git a/src/start.rs b/src/start.rs
index 5c5115e65cf6434331f03fba3923e23738682a4a..a21378c341b5ab9d5fce25d0ed33ffa5c024053c 100644
--- a/src/start.rs
+++ b/src/start.rs
@@ -77,19 +77,25 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! {
     stdio::stdout = stdio::default_stdout.get();
     stdio::stderr = stdio::default_stderr.get();
 
+    // Run preinit array
+    {
+        let mut f = &__preinit_array_start as *const _;
+        while f < &__preinit_array_end {
+            (*f)();
+            f = f.offset(1);
+        }
+    }
+
     // Call init section
     _init();
 
-    // Look for the neighbor functions in memory until the end
-    let mut f = &__preinit_array_start as *const _;
-    while f < &__preinit_array_end {
-        (*f)();
-        f = f.offset(1);
-    }
-    f = &__init_array_start as *const _;
-    while f < &__init_array_end {
-        (*f)();
-        f = f.offset(1);
+    // Run init array
+    {
+        let mut f = &__init_array_start as *const _;
+        while f < &__init_array_end {
+            (*f)();
+            f = f.offset(1);
+        }
     }
 
     // not argv or envp, because programs like bash try to modify this *const* pointer :|