From d2bb300b9bb7917d33e3bc37fca3bf6ee6e5fcc4 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Mon, 21 Dec 2015 11:49:28 -0500 Subject: Add static instance of _on_exit_args for _REENT_SMALL platforms. 2015-12-21 Freddie Chopin * libc/stdlib/on_exit_args.{c,h}: New files. * libc/stdlib/Makefile.am: Add new source file. * libc/stdlib/Makefile.in: Regenerate. * libc/stdlib/__atexit.c (__register_exitproc): Initialize _on_exit_args_ptr field of _GLOBAL_ATEXIT on first run. * libc/stdlib/on_exit.c: Force linking of static instance of _on_exit_args. * libc/stdlib/cxa_atexit.c: Likewise. --- newlib/libc/stdlib/on_exit_args.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 newlib/libc/stdlib/on_exit_args.c (limited to 'newlib/libc/stdlib/on_exit_args.c') diff --git a/newlib/libc/stdlib/on_exit_args.c b/newlib/libc/stdlib/on_exit_args.c new file mode 100644 index 000000000..88f9ffdbd --- /dev/null +++ b/newlib/libc/stdlib/on_exit_args.c @@ -0,0 +1,30 @@ +/* + * Static instance of _on_exit_args struct. + * + * When _REENT_SMALL is used, _atexit struct only contains a pointer to + * _on_exit_args struct, so this was always allocated with malloc() - even for + * the first 32 calls of atexit()-like functions, which are guaranteed to + * succeed, but could fail because of "out of memory" error. This is even worse + * when _ATEXIT_DYNAMIC_ALLOC is _NOT_ defined, in which case malloc() is not + * used by internals of atexit()-like functions. In such configuration all calls + * to the functions that need _on_exit_args struct (on_exit() and + * __cxa_atexit()) would fail. + * + * Thats why a static instance of _on_exit_args struct is provided for + * _REENT_SMALL configuration. This way the first 32 calls to atexit()-like + * functions don't need malloc() and will always succeed. + * + * Because this struct is not needed for "normal" atexit(), it is used as a weak + * reference in __register_exitproc(), but any use of on_exit() or + * __cxa_atexit() will force it to be linked. + */ + +#include + +#ifdef _REENT_SMALL + +static struct _on_exit_args _on_exit_args_instance = {{_NULL}, {_NULL}, 0, 0}; + +struct _on_exit_args * const __on_exit_args = &_on_exit_args_instance; + +#endif /* def _REENT_SMALL */ -- cgit v1.2.3