From 073cd03a2c5b0eb6c0872622f840f4a9724a9b04 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Thu, 8 Sep 2005 02:29:37 +0000 Subject: Fix by Martin Schlemmer: If _DL_FINI_CRT_COMPAT is defined, _dl_fini is setup to run at exit via atexit(), but this makes it run _before_ the fini (__app_fini()) of the app, causing stuff like sandbox that frees structs, etc via its fini to segfault. http://bugs.gentoo.org/98187 --- libc/stdlib/atexit.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'libc/stdlib') diff --git a/libc/stdlib/atexit.c b/libc/stdlib/atexit.c index 280f42cb7..c70318148 100644 --- a/libc/stdlib/atexit.c +++ b/libc/stdlib/atexit.c @@ -223,6 +223,11 @@ extern void (*__app_fini)(void); #endif extern void (*__rtld_fini)(void); + +#ifdef _DL_FINI_CRT_COMPAT +extern void (*__dl_fini)(void); +#endif + /* * Normal program termination */ @@ -242,6 +247,9 @@ void exit(int rv) #ifndef _DL_FINI_CRT_COMPAT if (__rtld_fini != NULL) (__rtld_fini)(); +#else + if (__dl_fini != NULL) + (__dl_fini)(); #endif /* If we are using stdio, try to shut it down. At the very least, -- cgit v1.2.3