diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/misc/internals/__uClibc_main.c | 7 | ||||
| -rw-r--r-- | libc/stdlib/atexit.c | 9 | 
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. | 
