From 706a8de7a091675bc19b701c1a7cb7196437a73f Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Sat, 15 Sep 2018 11:14:05 -0600 Subject: [PATCH] Call _init and _fini --- src/header/stdlib/mod.rs | 6 ++++++ src/start.rs | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs index 709bfc741..02750d144 100644 --- a/src/header/stdlib/mod.rs +++ b/src/header/stdlib/mod.rs @@ -218,12 +218,18 @@ pub extern "C" fn erand(xsubi: [c_ushort; 3]) -> c_double { #[no_mangle] pub unsafe extern "C" fn exit(status: c_int) { + extern "C" { + fn _fini(); + } + for i in (0..ATEXIT_FUNCS.len()).rev() { if let Some(func) = ATEXIT_FUNCS[i] { (func)(); } } + _fini(); + Sys::exit(status); } diff --git a/src/start.rs b/src/start.rs index 02e739f82..006b722d9 100644 --- a/src/start.rs +++ b/src/start.rs @@ -1,7 +1,7 @@ use alloc::Vec; use core::ptr; -use header::stdio; +use header::{stdio, stdlib}; use platform; use platform::types::*; use platform::{Pal, Sys}; @@ -30,6 +30,7 @@ impl Stack { #[no_mangle] pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! { extern "C" { + fn _init(); fn main(argc: isize, argv: *const *const c_char, envp: *const *const c_char) -> c_int; } @@ -63,11 +64,15 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! { stdio::stdout = stdio::default_stdout.get(); stdio::stderr = stdio::default_stderr.get(); - Sys::exit(main( + _init(); + + stdlib::exit(main( argc, argv, // not envp, because programs like bash try to modify this *const* // pointer :| platform::environ as *const *const c_char, )); + + unreachable!(); } -- GitLab