svn commit: trunk/uClibc: ldso/ldso libc/misc/internals libc/stdli etc...
vapier at uclibc.org
vapier at uclibc.org
Thu Sep 8 02:30:23 UTC 2005
Author: vapier
Date: 2005-09-07 19:29:37 -0700 (Wed, 07 Sep 2005)
New Revision: 11373
Log:
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
Modified:
trunk/uClibc/ldso/ldso/ldso.c
trunk/uClibc/libc/misc/internals/__uClibc_main.c
trunk/uClibc/libc/stdlib/atexit.c
Changeset:
Modified: trunk/uClibc/ldso/ldso/ldso.c
===================================================================
--- trunk/uClibc/ldso/ldso/ldso.c 2005-09-08 02:25:22 UTC (rev 11372)
+++ trunk/uClibc/ldso/ldso/ldso.c 2005-09-08 02:29:37 UTC (rev 11373)
@@ -766,11 +766,13 @@
#ifdef _DL_FINI_CRT_COMPAT
/* arches that have moved their ldso FINI handling should skip this part */
{
- int (*_dl_atexit) (void *) = (int (*)(void *)) (intptr_t) _dl_find_hash("atexit",
+ void (*__set__dl_fini) (void *) = (void (*)(void *)) (intptr_t) _dl_find_hash("_set__dl_fini",
_dl_symbol_tables, NULL, ELF_RTYPE_CLASS_PLT);
- if (_dl_atexit)
- (*_dl_atexit) (_dl_fini);
+ if (__set__dl_fini)
+ (*__set__dl_fini)(_dl_fini);
+ else
+ _dl_if_debug_dprint("_set__dl_fini not found\n");
}
#endif
Modified: trunk/uClibc/libc/misc/internals/__uClibc_main.c
===================================================================
--- trunk/uClibc/libc/misc/internals/__uClibc_main.c 2005-09-08 02:25:22 UTC (rev 11372)
+++ trunk/uClibc/libc/misc/internals/__uClibc_main.c 2005-09-08 02:29:37 UTC (rev 11373)
@@ -161,6 +161,16 @@
void attribute_hidden (*__rtld_fini)(void) = NULL;
+#ifdef _DL_FINI_CRT_COMPAT
+void attribute_hidden (*__dl_fini)(void) = NULL;
+
+void _set__dl_fini(void *fini_func)
+{
+ if (fini_func != NULL)
+ __dl_fini = fini_func;
+}
+#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
* are initialized, just before we call the application's main function.
Modified: trunk/uClibc/libc/stdlib/atexit.c
===================================================================
--- trunk/uClibc/libc/stdlib/atexit.c 2005-09-08 02:25:22 UTC (rev 11372)
+++ trunk/uClibc/libc/stdlib/atexit.c 2005-09-08 02:29:37 UTC (rev 11373)
@@ -223,6 +223,11 @@
#endif
extern void (*__rtld_fini)(void);
+
+#ifdef _DL_FINI_CRT_COMPAT
+extern void (*__dl_fini)(void);
+#endif
+
/*
* Normal program termination
*/
@@ -242,6 +247,9 @@
#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,
More information about the uClibc-cvs
mailing list