diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2021-05-20 11:26:00 +0300 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2021-05-20 11:26:00 +0300 |
| commit | b2eed2ae568b53ac910f4a3b8458eedf8d8c67ec (patch) | |
| tree | bff25c6d02605018e916b904ef77454812ca0f64 | |
| parent | d68f2b8681f8eeb6bbf1b4476a88f00b2962179e (diff) | |
| download | emacs-b2eed2ae568b53ac910f4a3b8458eedf8d8c67ec.tar.gz | |
Clean up the fix for unexec build on GNU/Linux
* src/conf_post.h [HYBRID_MALLOC || DARWIN_OS && HAVE_UNEXEC]:
Include <stdlib.h> here, before redirecting 'malloc' and friends
to their hybrid_* and unexec_* equivalents. #undef malloc and
friends before redefining. Provide prototypes for the
replacements. Suggested by Paul Eggert <eggert@cs.ucla.edu>.
* src/gmalloc.c [HYBRID_MALLOC]: Remove declarations of 'malloc'
and friends, as they are now redundant: we include <stdlib.h> in
conf_post.h before redefining 'malloc' etc., and that provides
prototypes from system headers.
* configure.ac (HYBRID_MALLOC): Remove kludge to avoid replacement
of 'free' by Gnulib. (Bug#36649)
| -rw-r--r-- | configure.ac | 3 | ||||
| -rw-r--r-- | src/conf_post.h | 31 | ||||
| -rw-r--r-- | src/gmalloc.c | 10 |
3 files changed, 30 insertions, 14 deletions
diff --git a/configure.ac b/configure.ac index d35ac6dbd37..d99e5395d35 100644 --- a/configure.ac +++ b/configure.ac @@ -2309,9 +2309,6 @@ elif test "$hybrid_malloc" = yes; then GNU_MALLOC_reason=" (only before dumping)" GMALLOC_OBJ=gmalloc.o VMLIMIT_OBJ= - # FIXME: This is to prevent Gnulib from redirecting 'free' to its - # replacement, instead of 'hybrid_free' in gmalloc.c. - gl_cv_func_free_preserves_errno=yes else test "$doug_lea_malloc" != "yes" && GMALLOC_OBJ=gmalloc.o VMLIMIT_OBJ=vm-limit.o diff --git a/src/conf_post.h b/src/conf_post.h index 176ab28b21a..8558dc466cc 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -99,10 +99,28 @@ typedef bool bool_bf; # define ADDRESS_SANITIZER false #endif +#ifdef emacs +/* We include stdlib.h here, because Gnulib's stdlib.h might redirect + 'free' to its replacement, and we want to avoid that in unexec + builds. Inclduing it here will render its inclusion after config.h + a no-op. */ +# if (defined DARWIN_OS && defined HAVE_UNEXEC) || defined HYBRID_MALLOC +# include <stdlib.h> +# endif +#endif + #if defined DARWIN_OS && defined emacs && defined HAVE_UNEXEC +# undef malloc # define malloc unexec_malloc +# undef realloc # define realloc unexec_realloc +# undef free # define free unexec_free + +extern void *unexec_malloc (size_t); +extern void *unexec_realloc (void *, size_t); +extern void unexec_free (void *); + #endif /* If HYBRID_MALLOC is defined (e.g., on Cygwin), emacs will use @@ -111,12 +129,23 @@ typedef bool bool_bf; accomplish this. */ #ifdef HYBRID_MALLOC #ifdef emacs +#undef malloc #define malloc hybrid_malloc +#undef realloc #define realloc hybrid_realloc +#undef aligned_alloc #define aligned_alloc hybrid_aligned_alloc +#undef calloc #define calloc hybrid_calloc +#undef free #define free hybrid_free -#endif + +extern void *hybrid_malloc (size_t); +extern void *hybrid_calloc (size_t, size_t); +extern void hybrid_free (void *); +extern void *hybrid_aligned_alloc (size_t, size_t); +extern void *hybrid_realloc (void *, size_t); +#endif /* emacs */ #endif /* HYBRID_MALLOC */ /* We have to go this route, rather than the old hpux9 approach of diff --git a/src/gmalloc.c b/src/gmalloc.c index 66008ea69b2..dedd25fa22f 100644 --- a/src/gmalloc.c +++ b/src/gmalloc.c @@ -1690,16 +1690,6 @@ valloc (size_t size) #undef free #ifdef HYBRID_MALLOC -/* Declare system malloc and friends. */ -extern void *malloc (size_t size); -extern void *realloc (void *ptr, size_t size); -extern void *calloc (size_t nmemb, size_t size); -extern void free (void *ptr); -#ifdef HAVE_ALIGNED_ALLOC -extern void *aligned_alloc (size_t alignment, size_t size); -#elif defined HAVE_POSIX_MEMALIGN -extern int posix_memalign (void **memptr, size_t alignment, size_t size); -#endif /* Assuming PTR was allocated via the hybrid malloc, return true if PTR was allocated via gmalloc, not the system malloc. Also, return |
