Pārlūkot izejas kodu

Run pre-init array before _init

Jeremy Soller 6 gadi atpakaļ
vecāks
revīzija
ae115ac6ff
1 mainītis faili ar 16 papildinājumiem un 10 dzēšanām
  1. 16 10
      src/start.rs

+ 16 - 10
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 :|