diff options
64 files changed, 256 insertions, 225 deletions
@@ -138,6 +138,11 @@ Deprecated and removed features, and other changes affecting compatibility: features now need to preload a new debugging DSO libc_malloc_debug.so to get this functionality back. +* The deprecated functions malloc_get_state and malloc_set_state have been + moved from the core C library into libc_malloc_debug.so. Legacy applications + that still use these functions will now need to preload libc_malloc_debug.so + in their environment using the LD_PRELOAD environment variable. + Changes to build and runtime requirements: * On Linux, the shm_open, sem_open, and related functions now expect the diff --git a/malloc/Makefile b/malloc/Makefile index b89af21d19..96328da247 100644 --- a/malloc/Makefile +++ b/malloc/Makefile @@ -331,3 +331,8 @@ tst-compathooks-on-malloc-check-ENV = \ LD_PRELOAD=$(objpfx)libc_malloc_debug.so tst-mallocstate-ENV = LD_PRELOAD=$(objpfx)libc_malloc_debug.so tst-mallocstate-malloc-check-ENV = LD_PRELOAD=$(objpfx)libc_malloc_debug.so + +# The test needs malloc_get_state/malloc_set_state which is in +# libc_malloc_debug.so. +$(objpfx)tst-mallocstate: $(objpfx)libc_malloc_debug.so +$(objpfx)tst-mallocstate-malloc-check: $(objpfx)libc_malloc_debug.so diff --git a/malloc/Versions b/malloc/Versions index cbb73d18c1..0a0bcf4bb5 100644 --- a/malloc/Versions +++ b/malloc/Versions @@ -25,7 +25,7 @@ libc { free; # m* - mallinfo; malloc; malloc_get_state; malloc_set_state; malloc_stats; + mallinfo; malloc; malloc_stats; malloc_trim; malloc_usable_size; mallopt; mcheck; memalign; mprobe; mtrace; muntrace; @@ -121,6 +121,8 @@ libc_malloc_debug { muntrace; mallinfo; + malloc_get_state; + malloc_set_state; malloc_stats; malloc_trim; malloc_usable_size; diff --git a/malloc/hooks.c b/malloc/hooks.c index 6c212fbc21..8e1afe55e5 100644 --- a/malloc/hooks.c +++ b/malloc/hooks.c @@ -39,120 +39,6 @@ void *weak_variable (*__malloc_hook) (size_t, const void *) = NULL; void *weak_variable (*__realloc_hook) (void *, size_t, const void *) = NULL; void *weak_variable (*__memalign_hook) (size_t, size_t, const void *) = NULL; -#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_25) - -/* Support for restoring dumped heaps contained in historic Emacs - executables. The heap saving feature (malloc_get_state) is no - longer implemented in this version of glibc, but we have a heap - rewriter in malloc_set_state which transforms the heap into a - version compatible with current malloc. */ - -#define MALLOC_STATE_MAGIC 0x444c4541l -#define MALLOC_STATE_VERSION (0 * 0x100l + 5l) /* major*0x100 + minor */ - -struct malloc_save_state -{ - long magic; - long version; - mbinptr av[NBINS * 2 + 2]; - char *sbrk_base; - int sbrked_mem_bytes; - unsigned long trim_threshold; - unsigned long top_pad; - unsigned int n_mmaps_max; - unsigned long mmap_threshold; - int check_action; - unsigned long max_sbrked_mem; - unsigned long max_total_mem; /* Always 0, for backwards compatibility. */ - unsigned int n_mmaps; - unsigned int max_n_mmaps; - unsigned long mmapped_mem; - unsigned long max_mmapped_mem; - int using_malloc_checking; - unsigned long max_fast; - unsigned long arena_test; - unsigned long arena_max; - unsigned long narenas; -}; - -/* Dummy implementation which always fails. We need to provide this - symbol so that existing Emacs binaries continue to work with - BIND_NOW. */ -void * -attribute_compat_text_section -malloc_get_state (void) -{ - __set_errno (ENOSYS); - return NULL; -} -compat_symbol (libc, malloc_get_state, malloc_get_state, GLIBC_2_0); - -int -attribute_compat_text_section -malloc_set_state (void *msptr) -{ - struct malloc_save_state *ms = (struct malloc_save_state *) msptr; - - if (ms->magic != MALLOC_STATE_MAGIC) - return -1; - - /* Must fail if the major version is too high. */ - if ((ms->version & ~0xffl) > (MALLOC_STATE_VERSION & ~0xffl)) - return -2; - - /* We do not need to perform locking here because malloc_set_state - must be called before the first call into the malloc subsytem - (usually via __malloc_initialize_hook). pthread_create always - calls calloc and thus must be called only afterwards, so there - cannot be more than one thread when we reach this point. */ - - /* Patch the dumped heap. We no longer try to integrate into the - existing heap. Instead, we mark the existing chunks as mmapped. - Together with the update to dumped_main_arena_start and - dumped_main_arena_end, realloc and free will recognize these - chunks as dumped fake mmapped chunks and never free them. */ - - /* Find the chunk with the lowest address with the heap. */ - mchunkptr chunk = NULL; - { - size_t *candidate = (size_t *) ms->sbrk_base; - size_t *end = (size_t *) (ms->sbrk_base + ms->sbrked_mem_bytes); - while (candidate < end) - if (*candidate != 0) - { - chunk = mem2chunk ((void *) (candidate + 1)); - break; - } - else - ++candidate; - } - if (chunk == NULL) - return 0; - - /* Iterate over the dumped heap and patch the chunks so that they - are treated as fake mmapped chunks. */ - mchunkptr top = ms->av[2]; - while (chunk < top) - { - if (inuse (chunk)) - { - /* Mark chunk as mmapped, to trigger the fallback path. */ - size_t size = chunksize (chunk); - set_head (chunk, size | IS_MMAPPED); - } - chunk = next_chunk (chunk); - } - - /* The dumped fake mmapped chunks all lie in this address range. */ - dumped_main_arena_start = (mchunkpt |
