summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/misc/internals/__uClibc_main.c7
-rw-r--r--libc/stdlib/atexit.c9
2 files changed, 13 insertions, 3 deletions
diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c
index 1940832d4..5f85b5928 100644
--- a/libc/misc/internals/__uClibc_main.c
+++ b/libc/misc/internals/__uClibc_main.c
@@ -101,6 +101,9 @@ void __uClibc_init(void)
}
+#ifdef __UCLIBC_CTOR_DTOR__
+void (*__app_fini)(void) = NULL;
+#endif
/* __uClibc_start_main is the new main stub for uClibc. This function is
* called from crt0 (version 0.9.16 or newer), after ALL shared libraries
@@ -128,9 +131,7 @@ __uClibc_start_main(int argc, char **argv, char **envp,
#ifdef __UCLIBC_CTOR_DTOR__
/* Arrange for the application's dtors to run before we exit. */
- if (app_fini!=NULL) {
- atexit(app_fini);
- }
+ __app_fini = app_fini;
/* Run all the application's ctors now. */
if (app_init!=NULL) {
diff --git a/libc/stdlib/atexit.c b/libc/stdlib/atexit.c
index 9a467bf79..082e532fd 100644
--- a/libc/stdlib/atexit.c
+++ b/libc/stdlib/atexit.c
@@ -218,6 +218,10 @@ void (*__exit_cleanup) (int) = 0;
pthread_mutex_t mylock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
#endif
+#ifdef __UCLIBC_CTOR_DTOR__
+extern void (*__app_fini)(void);
+#endif
+
/*
* Normal program termination
*/
@@ -230,6 +234,11 @@ void exit(int rv)
}
UNLOCK;
+#ifdef __UCLIBC_CTOR_DTOR__
+ if (__app_fini != NULL)
+ (__app_fini)();
+#endif
+
/* If we are using stdio, try to shut it down. At the very least,
* this will attempt to commit all buffered writes. It may also
* unbuffer all writable files, or close them outright.