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 :|