diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2009-04-23 17:54:22 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2009-04-23 17:54:22 +0000 |
commit | bbb9d4fde31f44a70a6fb42181dc86cb91791d7e (patch) | |
tree | 0b4710c307ae07243760387090df2a799f4e2830 /newlib | |
parent | 2beb9fbb02a83e61584e6fa838fd6d75bdd12e4f (diff) | |
download | cygnal-bbb9d4fde31f44a70a6fb42181dc86cb91791d7e.tar.gz cygnal-bbb9d4fde31f44a70a6fb42181dc86cb91791d7e.tar.bz2 cygnal-bbb9d4fde31f44a70a6fb42181dc86cb91791d7e.zip |
2009-04-23 Paul Brook <paul@codesourcery.com>
Kazu Hirata <kazu@codesourcery.com>
* libc/stdlib/__atexit.c (__register_exitproc): Use weak reference
to malloc. Allocate dynamically only if it is present.
* libc/stdlib/__call_atexit.c (__call_exitprocs): Use weak
reference to free. Call free only if it is present.
Diffstat (limited to 'newlib')
-rw-r--r-- | newlib/ChangeLog | 8 | ||||
-rw-r--r-- | newlib/libc/stdlib/__atexit.c | 11 | ||||
-rw-r--r-- | newlib/libc/stdlib/__call_atexit.c | 8 |
3 files changed, 26 insertions, 1 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 39ab966fb..fce8f2a77 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,11 @@ +2009-04-23 Paul Brook <paul@codesourcery.com> + Kazu Hirata <kazu@codesourcery.com> + + * libc/stdlib/__atexit.c (__register_exitproc): Use weak reference + to malloc. Allocate dynamically only if it is present. + * libc/stdlib/__call_atexit.c (__call_exitprocs): Use weak + reference to free. Call free only if it is present. + 2009-04-22 Anthony Green <green@moxielogic.com> * configure.host: Add moxie support. diff --git a/newlib/libc/stdlib/__atexit.c b/newlib/libc/stdlib/__atexit.c index 49eebb37e..4f0b67c9e 100644 --- a/newlib/libc/stdlib/__atexit.c +++ b/newlib/libc/stdlib/__atexit.c @@ -8,6 +8,8 @@ #include <sys/lock.h> #include "atexit.h" +/* Make this a weak reference to avoid pulling in malloc. */ +void * malloc(size_t) _ATTRIBUTE((__weak__)); /* * Register a function to be performed at exit or on shared library unload. @@ -38,6 +40,11 @@ _DEFUN (__register_exitproc, #ifndef _ATEXIT_DYNAMIC_ALLOC return -1; #else + /* Don't dynamically allocate the atexit array if malloc is not + available. */ + if (!malloc) + return -1; + p = (struct _atexit *) malloc (sizeof *p); if (p == NULL) { @@ -62,7 +69,9 @@ _DEFUN (__register_exitproc, args = p->_on_exit_args_ptr; if (args == NULL) { - args = malloc (sizeof * p->_on_exit_args_ptr); + if (malloc) + args = malloc (sizeof * p->_on_exit_args_ptr); + if (args == NULL) { #ifndef __SINGLE_THREAD__ diff --git a/newlib/libc/stdlib/__call_atexit.c b/newlib/libc/stdlib/__call_atexit.c index ab86fcafa..e7f956184 100644 --- a/newlib/libc/stdlib/__call_atexit.c +++ b/newlib/libc/stdlib/__call_atexit.c @@ -7,6 +7,9 @@ #include <reent.h> #include "atexit.h" +/* Make this a weak reference to avoid pulling in free. */ +void free(void *) _ATTRIBUTE((__weak__)); + /* * Call registered exit handlers. If D is null then all handlers are called, * otherwise only the handlers from that DSO are called. @@ -76,6 +79,11 @@ _DEFUN (__call_exitprocs, (code, d), #ifndef _ATEXIT_DYNAMIC_ALLOC break; #else + /* Don't dynamically free the atexit array if free is not + available. */ + if (!free) + break; + /* Move to the next block. Free empty blocks except the last one, which is part of _GLOBAL_REENT. */ if (p->_ind == 0 && p->_next) |