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