[PATCH v8 07/10] mtrace: Wean away from malloc hooks

Carlos O'Donell carlos@redhat.com
Sat Jul 17 22:04:23 GMT 2021


On 7/13/21 3:38 AM, Siddhesh Poyarekar wrote:
> Wean mtrace away from the malloc hooks and move them into the debug
> DSO.  Split the API away from the implementation so that we can add
> the API to libc.so as well as libc_malloc_debug.so, with the libc
> implementations being empty.
> 
> Update localplt data since memalign no longer has any callers after
> this change.

OK for 2.34.

Tested without regression on x86_64 and i686.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>

> ---
>  malloc/Versions                               |   2 +
>  malloc/malloc-debug.c                         |  13 +
>  malloc/mtrace-impl.c                          | 226 +++++++++++++
>  malloc/mtrace.c                               | 314 +-----------------
>  sysdeps/generic/localplt.data                 |   1 -
>  .../mach/hurd/i386/libc_malloc_debug.abilist  |   2 +
>  sysdeps/mach/hurd/i386/localplt.data          |   1 -
>  .../linux/aarch64/libc_malloc_debug.abilist   |   2 +
>  sysdeps/unix/sysv/linux/aarch64/localplt.data |   1 -
>  .../linux/alpha/libc_malloc_debug.abilist     |   2 +
>  sysdeps/unix/sysv/linux/alpha/localplt.data   |   1 -
>  .../sysv/linux/arc/libc_malloc_debug.abilist  |   2 +
>  sysdeps/unix/sysv/linux/arc/localplt.data     |   1 -
>  .../linux/arm/be/libc_malloc_debug.abilist    |   2 +
>  .../linux/arm/le/libc_malloc_debug.abilist    |   2 +
>  sysdeps/unix/sysv/linux/arm/localplt.data     |   1 -
>  .../sysv/linux/csky/libc_malloc_debug.abilist |   2 +
>  sysdeps/unix/sysv/linux/csky/localplt.data    |   1 -
>  .../sysv/linux/hppa/libc_malloc_debug.abilist |   2 +
>  sysdeps/unix/sysv/linux/hppa/localplt.data    |   1 -
>  .../sysv/linux/i386/libc_malloc_debug.abilist |   2 +
>  sysdeps/unix/sysv/linux/i386/localplt.data    |   1 -
>  .../sysv/linux/ia64/libc_malloc_debug.abilist |   2 +
>  sysdeps/unix/sysv/linux/ia64/localplt.data    |   1 -
>  .../m68k/coldfire/libc_malloc_debug.abilist   |   2 +
>  .../sysv/linux/m68k/coldfire/localplt.data    |   1 -
>  .../m68k/m680x0/libc_malloc_debug.abilist     |   2 +
>  .../unix/sysv/linux/m68k/m680x0/localplt.data |   1 -
>  .../microblaze/be/libc_malloc_debug.abilist   |   2 +
>  .../microblaze/le/libc_malloc_debug.abilist   |   2 +
>  .../unix/sysv/linux/microblaze/localplt.data  |   1 -
>  .../mips/mips32/fpu/libc_malloc_debug.abilist |   2 +
>  .../mips32/nofpu/libc_malloc_debug.abilist    |   2 +
>  .../mips/mips64/n32/libc_malloc_debug.abilist |   2 +
>  .../mips/mips64/n64/libc_malloc_debug.abilist |   2 +
>  .../linux/nios2/libc_malloc_debug.abilist     |   2 +
>  sysdeps/unix/sysv/linux/nios2/localplt.data   |   1 -
>  .../powerpc32/fpu/libc_malloc_debug.abilist   |   2 +
>  .../linux/powerpc/powerpc32/fpu/localplt.data |   1 -
>  .../powerpc32/nofpu/libc_malloc_debug.abilist |   2 +
>  .../powerpc/powerpc32/nofpu/localplt.data     |   1 -
>  .../powerpc64/be/libc_malloc_debug.abilist    |   2 +
>  .../powerpc64/le/libc_malloc_debug.abilist    |   2 +
>  .../linux/powerpc/powerpc64/localplt.data     |   1 -
>  sysdeps/unix/sysv/linux/riscv/localplt.data   |   1 -
>  .../riscv/rv32/libc_malloc_debug.abilist      |   2 +
>  .../riscv/rv64/libc_malloc_debug.abilist      |   2 +
>  sysdeps/unix/sysv/linux/s390/localplt.data    |   1 -
>  .../s390/s390-32/libc_malloc_debug.abilist    |   2 +
>  .../s390/s390-64/libc_malloc_debug.abilist    |   2 +
>  .../linux/sh/be/libc_malloc_debug.abilist     |   2 +
>  .../linux/sh/le/libc_malloc_debug.abilist     |   2 +
>  sysdeps/unix/sysv/linux/sh/localplt.data      |   1 -
>  .../sparc/sparc32/libc_malloc_debug.abilist   |   2 +
>  .../sysv/linux/sparc/sparc32/localplt.data    |   1 -
>  .../sparc/sparc64/libc_malloc_debug.abilist   |   2 +
>  .../sysv/linux/sparc/sparc64/localplt.data    |   1 -
>  .../linux/x86_64/64/libc_malloc_debug.abilist |   2 +
>  .../x86_64/x32/libc_malloc_debug.abilist      |   2 +
>  sysdeps/x86_64/localplt.data                  |   1 -
>  60 files changed, 319 insertions(+), 325 deletions(-)
>  create mode 100644 malloc/mtrace-impl.c
> 
> diff --git a/malloc/Versions b/malloc/Versions
> index 6548970419..71d933de19 100644
> --- a/malloc/Versions
> +++ b/malloc/Versions
> @@ -117,6 +117,8 @@ libc_malloc_debug {
>  
>      mcheck;
>      mprobe;
> +    mtrace;
> +    muntrace;

OK.

>    }
>    GLIBC_2.2 {
>      mcheck_check_all;
> diff --git a/malloc/malloc-debug.c b/malloc/malloc-debug.c
> index 7c3a1e26b5..9942124e02 100644
> --- a/malloc/malloc-debug.c
> +++ b/malloc/malloc-debug.c
> @@ -49,6 +49,7 @@ enum malloc_debug_hooks
>  {
>    MALLOC_NONE_HOOK = 0,
>    MALLOC_MCHECK_HOOK = 1 << 0, /* mcheck()  */
> +  MALLOC_MTRACE_HOOK = 1 << 1, /* mtrace()  */

OK.

>  };
>  static unsigned __malloc_debugging_hooks;
>  
> @@ -71,6 +72,7 @@ __malloc_debug_disable (enum malloc_debug_hooks flag)
>  }
>  
>  #include "mcheck.c"
> +#include "mtrace.c"
>  
>  extern void (*__malloc_initialize_hook) (void);
>  compat_symbol_reference (libc, __malloc_initialize_hook,
> @@ -154,6 +156,8 @@ __debug_malloc (size_t bytes)
>      }
>    if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && victim != NULL)
>      victim = malloc_mcheck_after (victim, orig_bytes);
> +  if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +    malloc_mtrace_after (victim, orig_bytes, RETURN_ADDRESS (0));
>  
>    return victim;
>  }
> @@ -171,6 +175,8 @@ __debug_free (void *mem)
>  
>    if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK))
>      mem = free_mcheck (mem);
> +  if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +    free_mtrace (mem, RETURN_ADDRESS (0));
>  
>    __libc_free (mem);
>  }
> @@ -195,6 +201,8 @@ __debug_realloc (void *oldmem, size_t bytes)
>    if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && victim != NULL)
>      victim = realloc_mcheck_after (victim, oldmem, orig_bytes,
>  				   oldsize);
> +  if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +    realloc_mtrace_after (victim, oldmem, orig_bytes, RETURN_ADDRESS (0));
>  
>    return victim;
>  }
> @@ -218,6 +226,8 @@ _debug_mid_memalign (size_t alignment, size_t bytes, const void *address)
>      }
>    if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && victim != NULL)
>      victim = memalign_mcheck_after (victim, alignment, orig_bytes);
> +  if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +    memalign_mtrace_after (victim, orig_bytes, address);
>  
>    return victim;
>  }
> @@ -317,6 +327,9 @@ __debug_calloc (size_t nmemb, size_t size)
>  	victim = malloc_mcheck_after (victim, orig_bytes);
>        memset (victim, 0, orig_bytes);
>      }
> +  if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +    malloc_mtrace_after (victim, orig_bytes, RETURN_ADDRESS (0));
> +
>    return victim;
>  }
>  strong_alias (__debug_calloc, calloc)

OK.

> diff --git a/malloc/mtrace-impl.c b/malloc/mtrace-impl.c
> new file mode 100644
> index 0000000000..0e10ab7f60
> --- /dev/null
> +++ b/malloc/mtrace-impl.c
> @@ -0,0 +1,226 @@
> +/* mtrace implementation for `malloc'.
> +   Copyright (C) 1991-2021 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +                 Written April 2, 1991 by John Gilmore of Cygnus Support.
> +                 Based on mcheck.c by Mike Haertel.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +
> +#include <malloc.h>
> +#include <mcheck.h>
> +
> +#include <dlfcn.h>
> +#include <fcntl.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <inttypes.h>
> +
> +#include <libc-internal.h>
> +#include <dso_handle.h>
> +
> +#include <kernel-features.h>
> +
> +#define TRACE_BUFFER_SIZE 512
> +
> +static FILE *mallstream;
> +static const char mallenv[] = "MALLOC_TRACE";
> +static char *malloc_trace_buffer;
> +
> +static void
> +tr_where (const void *caller, Dl_info *info)
> +{
> +  if (caller != NULL)
> +    {
> +      if (info != NULL)
> +        {
> +          char *buf = (char *) "";
> +          if (info->dli_sname != NULL)
> +            {
> +              size_t len = strlen (info->dli_sname);
> +              buf = alloca (len + 6 + 2 * sizeof (void *));
> +	      char sign;
> +	      ptrdiff_t offset =
> +		(ptrdiff_t) info->dli_saddr - (ptrdiff_t) caller;
> +
> +	      if (caller >= (const void *) info->dli_saddr)
> +		{
> +		  sign = '+';
> +		  offset = -offset;
> +		}
> +	      else
> +		  sign = '-';
> +
> +	      sprintf (buf, "(%s%c%" PRIxPTR ")", info->dli_sname, sign,
> +		       offset);
> +            }
> +
> +	  fprintf (mallstream, "@ %s%s%s[%p] ", info->dli_fname ? : "",
> +		   info->dli_fname ? ":" : "",
> +                   buf, caller);
> +        }
> +      else
> +        fprintf (mallstream, "@ [%p] ", caller);
> +    }
> +}
> +
> +static Dl_info *
> +lock_and_info (const void *caller, Dl_info *mem)
> +{
> +  if (caller == NULL)
> +    return NULL;
> +
> +  Dl_info *res = dladdr (caller, mem) ? mem : NULL;
> +
> +  flockfile (mallstream);
> +
> +  return res;
> +}
> +
> +static void
> +free_mtrace (void *ptr, const void *caller)
> +{
> +  if (ptr == NULL)
> +    return;
> +
> +  Dl_info mem;
> +  Dl_info *info = lock_and_info (caller, &mem);
> +  tr_where (caller, info);
> +  /* Be sure to print it first.  */
> +  fprintf (mallstream, "- %p\n", ptr);
> +  funlockfile (mallstream);
> +}
> +
> +static void
> +malloc_mtrace_after (void *block, size_t size, const void *caller)
> +{
> +  Dl_info mem;
> +  Dl_info *info = lock_and_info (caller, &mem);
> +
> +  tr_where (caller, info);
> +  /* We could be printing a NULL here; that's OK.  */
> +  fprintf (mallstream, "+ %p %#lx\n", block, (unsigned long int) size);
> +
> +  funlockfile (mallstream);
> +}
> +
> +static void
> +realloc_mtrace_after (void *block, const void *oldptr, size_t size,
> +		      const void *caller)
> +{
> +  Dl_info mem;
> +  Dl_info *info = lock_and_info (caller, &mem);
> +
> +  tr_where (caller, info);
> +  if (block == NULL)
> +    {
> +      if (size != 0)
> +        /* Failed realloc.  */
> +	fprintf (mallstream, "! %p %#lx\n", oldptr, (unsigned long int) size);
> +      else
> +        fprintf (mallstream, "- %p\n", oldptr);
> +    }
> +  else if (oldptr == NULL)
> +    fprintf (mallstream, "+ %p %#lx\n", block, (unsigned long int) size);
> +  else
> +    {
> +      fprintf (mallstream, "< %p\n", oldptr);
> +      tr_where (caller, info);
> +      fprintf (mallstream, "> %p %#lx\n", block, (unsigned long int) size);
> +    }
> +
> +  funlockfile (mallstream);
> +}
> +
> +static void
> +memalign_mtrace_after (void *block, size_t size, const void *caller)
> +{
> +  Dl_info mem;
> +  Dl_info *info = lock_and_info (caller, &mem);
> +
> +  tr_where (caller, info);
> +  /* We could be printing a NULL here; that's OK.  */
> +  fprintf (mallstream, "+ %p %#lx\n", block, (unsigned long int) size);
> +
> +  funlockfile (mallstream);
> +}
> +
> +/* This function gets called to make sure all memory the library
> +   allocates get freed and so does not irritate the user when studying
> +   the mtrace output.  */
> +static void
> +release_libc_mem (void)
> +{
> +  /* Only call the free function if we still are running in mtrace mode.  */
> +  if (mallstream != NULL)
> +    __libc_freeres ();
> +}
> +
> +/* We enable tracing if the environment variable MALLOC_TRACE is set.  */
> +
> +static void
> +do_mtrace (void)
> +{
> +  static int added_atexit_handler;
> +  char *mallfile;
> +
> +  /* Don't panic if we're called more than once.  */
> +  if (mallstream != NULL)
> +    return;
> +
> +  mallfile = secure_getenv (mallenv);
> +  if (mallfile != NULL)
> +    {
> +      char *mtb = malloc (TRACE_BUFFER_SIZE);
> +      if (mtb == NULL)
> +        return;
> +
> +      mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wce");
> +      if (mallstream != NULL)
> +        {
> +          /* Be sure it doesn't malloc its buffer!  */
> +          malloc_trace_buffer = mtb;
> +          setvbuf (mallstream, malloc_trace_buffer, _IOFBF, TRACE_BUFFER_SIZE);
> +          fprintf (mallstream, "= Start\n");
> +          if (!added_atexit_handler)
> +            {
> +              added_atexit_handler = 1;
> +              __cxa_atexit ((void (*)(void *))release_libc_mem, NULL,
> +			    __dso_handle);
> +            }
> +	  __malloc_debug_enable (MALLOC_MTRACE_HOOK);
> +        }
> +      else
> +        free (mtb);
> +    }
> +}
> +
> +static void
> +do_muntrace (void)
> +{
> +  __malloc_debug_disable (MALLOC_MTRACE_HOOK);
> +  if (mallstream == NULL)
> +    return;
> +
> +  /* Do the reverse of what done in mtrace: first reset the hooks and
> +     MALLSTREAM, and only after that write the trailer and close the
> +     file.  */
> +  FILE *f = mallstream;
> +  mallstream = NULL;
> +
> +  fprintf (f, "= End\n");
> +  fclose (f);
> +}

OK.

> diff --git a/malloc/mtrace.c b/malloc/mtrace.c
> index fb58413d39..c1c836a740 100644
> --- a/malloc/mtrace.c
> +++ b/malloc/mtrace.c
> @@ -1,4 +1,4 @@
> -/* More debugging hooks for `malloc'.
> +/* mtrace API for `malloc'.
>     Copyright (C) 1991-2021 Free Software Foundation, Inc.
>     This file is part of the GNU C Library.
>                   Written April 2, 1991 by John Gilmore of Cygnus Support.
> @@ -18,40 +18,14 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>  
> -#ifndef _MALLOC_INTERNAL
> -# define _MALLOC_INTERNAL
> -# include <malloc.h>
> -# include <mcheck.h>
> -# include <malloc-internal.h>
> -# include <libc-lock.h>
> +#if !IS_IN (libc)
> +# include "mtrace-impl.c"
> +#else
> +# include <shlib-compat.h>
> +# include <libc-symbols.h>
>  #endif
>  
> -#include <dlfcn.h>
> -#include <fcntl.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <stdlib.h>
> -
> -#include <_itoa.h>
> -
> -#include <libc-internal.h>
> -#include <dso_handle.h>
> -
> -#include <libio/iolibio.h>
> -#define setvbuf(s, b, f, l) _IO_setvbuf (s, b, f, l)
> -#define fwrite(buf, size, count, fp) _IO_fwrite (buf, size, count, fp)
> -
> -#include <kernel-features.h>
> -
> -#define TRACE_BUFFER_SIZE 512
> -
> -static FILE *mallstream;
> -static const char mallenv[] = "MALLOC_TRACE";
> -static char *malloc_trace_buffer;
> -
> -__libc_lock_define_initialized (static, lock);
> -
> -#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_34)
> +#if IS_IN (libc) && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_34)
>  /* Compatibility symbols that were introduced to help break at allocation sites
>     for specific memory allocations.  This is unusable with ASLR, although gdb
>     may allow predictable allocation addresses.  Even then, gdb has watchpoint
> @@ -71,282 +45,18 @@ compat_symbol (libc, tr_break, tr_break, GLIBC_2_0);
>  #endif
>  
>  
> -/* Old hook values.  */
> -static void (*tr_old_free_hook) (void *ptr, const void *);
> -static void *(*tr_old_malloc_hook) (size_t size, const void *);
> -static void *(*tr_old_realloc_hook) (void *ptr, size_t size,
> -				     const void *);
> -static void *(*tr_old_memalign_hook) (size_t __alignment, size_t __size,
> -				      const void *);
> -
> -static void
> -tr_where (const void *caller, Dl_info *info)
> -{
> -  if (caller != NULL)
> -    {
> -      if (info != NULL)
> -        {
> -          char *buf = (char *) "";
> -          if (info->dli_sname != NULL)
> -            {
> -              size_t len = strlen (info->dli_sname);
> -              buf = alloca (len + 6 + 2 * sizeof (void *));
> -
> -              buf[0] = '(';
> -              __stpcpy (_fitoa (caller >= (const void *) info->dli_saddr
> -                                ? caller - (const void *) info->dli_saddr
> -                                : (const void *) info->dli_saddr - caller,
> -                                __stpcpy (__mempcpy (buf + 1, info->dli_sname,
> -                                                     len),
> -                                          caller >= (void *) info->dli_saddr
> -                                          ? "+0x" : "-0x"),
> -                                16, 0),
> -                        ")");
> -            }
> -
> -          fprintf (mallstream, "@ %s%s%s[%p] ",
> -                   info->dli_fname ? : "", info->dli_fname ? ":" : "",
> -                   buf, caller);
> -        }
> -      else
> -        fprintf (mallstream, "@ [%p] ", caller);
> -    }
> -}
> -
> -static Dl_info *
> -lock_and_info (const void *caller, Dl_info *mem)
> -{
> -  if (caller == NULL)
> -    return NULL;
> -
> -  Dl_info *res = _dl_addr (caller, mem, NULL, NULL) ? mem : NULL;
> -
> -  __libc_lock_lock (lock);
> -
> -  return res;
> -}
> -
> -static void tr_freehook (void *, const void *);
> -static void * tr_mallochook (size_t, const void *);
> -static void * tr_reallochook (void *, size_t, const void *);
> -static void * tr_memalignhook (size_t, size_t, const void *);
> -
> -/* Set all the default non-trace hooks.  */
> -static __always_inline void
> -set_default_hooks (void)
> -{
> -  __free_hook = tr_old_free_hook;
> -  __malloc_hook = tr_old_malloc_hook;
> -  __realloc_hook = tr_old_realloc_hook;
> -  __memalign_hook = tr_old_memalign_hook;
> -}
> -
> -/* Set all of the tracing hooks used for mtrace.  */
> -static __always_inline void
> -set_trace_hooks (void)
> -{
> -  __free_hook = tr_freehook;
> -  __malloc_hook = tr_mallochook;
> -  __realloc_hook = tr_reallochook;
> -  __memalign_hook = tr_memalignhook;
> -}
> -
> -/* Save the current set of hooks as the default hooks.  */
> -static __always_inline void
> -save_default_hooks (void)
> -{
> -  tr_old_free_hook = __free_hook;
> -  tr_old_malloc_hook = __malloc_hook;
> -  tr_old_realloc_hook = __realloc_hook;
> -  tr_old_memalign_hook = __memalign_hook;
> -}
> -
> -static void
> -tr_freehook (void *ptr, const void *caller)
> -{
> -  if (ptr == NULL)
> -    return;
> -
> -  Dl_info mem;
> -  Dl_info *info = lock_and_info (caller, &mem);
> -  tr_where (caller, info);
> -  /* Be sure to print it first.  */
> -  fprintf (mallstream, "- %p\n", ptr);
> -  set_default_hooks ();
> -  if (tr_old_free_hook != NULL)
> -    (*tr_old_free_hook)(ptr, caller);
> -  else
> -    free (ptr);
> -  set_trace_hooks ();
> -  __libc_lock_unlock (lock);
> -}
> -
> -static void *
> -tr_mallochook (size_t size, const void *caller)
> -{
> -  void *hdr;
> -
> -  Dl_info mem;
> -  Dl_info *info = lock_and_info (caller, &mem);
> -
> -  set_default_hooks ();
> -  if (tr_old_malloc_hook != NULL)
> -    hdr = (void *) (*tr_old_malloc_hook)(size, caller);
> -  else
> -    hdr = (void *) malloc (size);
> -  set_trace_hooks ();
> -
> -  tr_where (caller, info);
> -  /* We could be printing a NULL here; that's OK.  */
> -  fprintf (mallstream, "+ %p %#lx\n", hdr, (unsigned long int) size);
> -
> -  __libc_lock_unlock (lock);
> -
> -  return hdr;
> -}
> -
> -static void *
> -tr_reallochook (void *ptr, size_t size, const void *caller)
> -{
> -  void *hdr;
> -
> -  Dl_info mem;
> -  Dl_info *info = lock_and_info (caller, &mem);
> -
> -  set_default_hooks ();
> -  if (tr_old_realloc_hook != NULL)
> -    hdr = (void *) (*tr_old_realloc_hook)(ptr, size, caller);
> -  else
> -    hdr = (void *) realloc (ptr, size);
> -  set_trace_hooks ();
> -
> -  tr_where (caller, info);
> -  if (hdr == NULL)
> -    {
> -      if (size != 0)
> -        /* Failed realloc.  */
> -        fprintf (mallstream, "! %p %#lx\n", ptr, (unsigned long int) size);
> -      else
> -        fprintf (mallstream, "- %p\n", ptr);
> -    }
> -  else if (ptr == NULL)
> -    fprintf (mallstream, "+ %p %#lx\n", hdr, (unsigned long int) size);
> -  else
> -    {
> -      fprintf (mallstream, "< %p\n", ptr);
> -      tr_where (caller, info);
> -      fprintf (mallstream, "> %p %#lx\n", hdr, (unsigned long int) size);
> -    }
> -
> -  __libc_lock_unlock (lock);
> -
> -  return hdr;
> -}
> -
> -static void *
> -tr_memalignhook (size_t alignment, size_t size, const void *caller)
> -{
> -  void *hdr;
> -
> -  Dl_info mem;
> -  Dl_info *info = lock_and_info (caller, &mem);
> -
> -  set_default_hooks ();
> -  if (tr_old_memalign_hook != NULL)
> -    hdr = (void *) (*tr_old_memalign_hook)(alignment, size, caller);
> -  else
> -    hdr = (void *) memalign (alignment, size);
> -  set_trace_hooks ();
> -
> -  tr_where (caller, info);
> -  /* We could be printing a NULL here; that's OK.  */
> -  fprintf (mallstream, "+ %p %#lx\n", hdr, (unsigned long int) size);
> -
> -  __libc_lock_unlock (lock);
> -
> -  return hdr;
> -}
> -
> -
> -#ifdef _LIBC
> -
> -/* This function gets called to make sure all memory the library
> -   allocates get freed and so does not irritate the user when studying
> -   the mtrace output.  */
> -static void __libc_freeres_fn_section
> -release_libc_mem (void)
> -{
> -  /* Only call the free function if we still are running in mtrace mode.  */
> -  if (mallstream != NULL)
> -    __libc_freeres ();
> -}
> -#endif
> -
> -
> -/* We enable tracing if the environment variable MALLOC_TRACE is set.  */
> -
>  void
>  mtrace (void)
>  {
> -#ifdef _LIBC
> -  static int added_atexit_handler;
> +#if !IS_IN (libc)
> +  do_mtrace ();
>  #endif
> -  char *mallfile;
> -
> -  /* Don't panic if we're called more than once.  */
> -  if (mallstream != NULL)
> -    return;
> -
> -#ifdef _LIBC
> -  /* When compiling the GNU libc we use the secure getenv function
> -     which prevents the misuse in case of SUID or SGID enabled
> -     programs.  */
> -  mallfile = __libc_secure_getenv (mallenv);
> -#else
> -  mallfile = getenv (mallenv);
> -#endif
> -  if (mallfile != NULL)
> -    {
> -      char *mtb = malloc (TRACE_BUFFER_SIZE);
> -      if (mtb == NULL)
> -        return;
> -
> -      mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wce");
> -      if (mallstream != NULL)
> -        {
> -          /* Be sure it doesn't malloc its buffer!  */
> -          malloc_trace_buffer = mtb;
> -          setvbuf (mallstream, malloc_trace_buffer, _IOFBF, TRACE_BUFFER_SIZE);
> -          fprintf (mallstream, "= Start\n");
> -	  save_default_hooks ();
> -	  set_trace_hooks ();
> -#ifdef _LIBC
> -          if (!added_atexit_handler)
> -            {
> -              added_atexit_handler = 1;
> -              __cxa_atexit ((void (*)(void *))release_libc_mem, NULL,
> -			    __dso_handle);
> -            }
> -#endif
> -        }
> -      else
> -        free (mtb);
> -    }
>  }
>  
>  void
>  muntrace (void)
>  {
> -  if (mallstream == NULL)
> -    return;
> -
> -  /* Do the reverse of what done in mtrace: first reset the hooks and
> -     MALLSTREAM, and only after that write the trailer and close the
> -     file.  */
> -  FILE *f = mallstream;
> -  mallstream = NULL;
> -  set_default_hooks ();
> -
> -  fprintf (f, "= End\n");
> -  fclose (f);
> +#if !IS_IN (libc)
> +  do_muntrace ();
> +#endif
>  }

OK.

> diff --git a/sysdeps/generic/localplt.data b/sysdeps/generic/localplt.data
> index e2083c0ce6..9b4f35786a 100644
> --- a/sysdeps/generic/localplt.data
> +++ b/sysdeps/generic/localplt.data
> @@ -4,7 +4,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign

OK.

>  libc.so: realloc
>  libm.so: matherr
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/mach/hurd/i386/libc_malloc_debug.abilist b/sysdeps/mach/hurd/i386/libc_malloc_debug.abilist
> index c5e1192b27..798d3ae8a3 100644
> --- a/sysdeps/mach/hurd/i386/libc_malloc_debug.abilist
> +++ b/sysdeps/mach/hurd/i386/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.2.6 mcheck_check_all F
>  GLIBC_2.2.6 mcheck_pedantic F
>  GLIBC_2.2.6 memalign F
>  GLIBC_2.2.6 mprobe F
> +GLIBC_2.2.6 mtrace F
> +GLIBC_2.2.6 muntrace F
>  GLIBC_2.2.6 posix_memalign F
>  GLIBC_2.2.6 pvalloc F
>  GLIBC_2.2.6 realloc F
> diff --git a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data
> index 94064ecbc5..47fbe1e2a7 100644
> --- a/sysdeps/mach/hurd/i386/localplt.data
> +++ b/sysdeps/mach/hurd/i386/localplt.data
> @@ -6,7 +6,6 @@
>  libc.so: calloc + REL R_386_GLOB_DAT
>  libc.so: free + REL R_386_GLOB_DAT
>  libc.so: malloc + REL R_386_GLOB_DAT
> -libc.so: memalign + REL R_386_GLOB_DAT
>  libc.so: realloc + REL R_386_GLOB_DAT
>  libm.so: matherr + REL R_386_GLOB_DAT
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/aarch64/libc_malloc_debug.abilist
> index cc6531b017..bf543ed1e0 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.17 mcheck_check_all F
>  GLIBC_2.17 mcheck_pedantic F
>  GLIBC_2.17 memalign F
>  GLIBC_2.17 mprobe F
> +GLIBC_2.17 mtrace F
> +GLIBC_2.17 muntrace F
>  GLIBC_2.17 posix_memalign F
>  GLIBC_2.17 pvalloc F
>  GLIBC_2.17 realloc F
> diff --git a/sysdeps/unix/sysv/linux/aarch64/localplt.data b/sysdeps/unix/sysv/linux/aarch64/localplt.data
> index 2c14b652ef..348b3f3793 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/localplt.data
> +++ b/sysdeps/unix/sysv/linux/aarch64/localplt.data
> @@ -4,7 +4,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # If outline atomics are used, libgcc (built outside of glibc) may
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/alpha/libc_malloc_debug.abilist
> index 5fe020dca6..fa8beb5e83 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/alpha/localplt.data b/sysdeps/unix/sysv/linux/alpha/localplt.data
> index 43f6fdaea1..44bf36f4f1 100644
> --- a/sysdeps/unix/sysv/linux/alpha/localplt.data
> +++ b/sysdeps/unix/sysv/linux/alpha/localplt.data
> @@ -18,7 +18,6 @@ libc.so: _Unwind_Find_FDE
>  libc.so: calloc + RELA R_ALPHA_GLOB_DAT
>  libc.so: free + RELA R_ALPHA_GLOB_DAT
>  libc.so: malloc + RELA R_ALPHA_GLOB_DAT
> -libc.so: memalign + RELA R_ALPHA_GLOB_DAT
>  libc.so: realloc + RELA R_ALPHA_GLOB_DAT
>  libm.so: matherr + RELA R_ALPHA_GLOB_DAT
>  # We used to offer inline functions that used this, so it must be exported.
> diff --git a/sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist
> index b5e9d10b9f..14bad4f83a 100644
> --- a/sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.32 mcheck_check_all F
>  GLIBC_2.32 mcheck_pedantic F
>  GLIBC_2.32 memalign F
>  GLIBC_2.32 mprobe F
> +GLIBC_2.32 mtrace F
> +GLIBC_2.32 muntrace F
>  GLIBC_2.32 posix_memalign F
>  GLIBC_2.32 pvalloc F
>  GLIBC_2.32 realloc F
> diff --git a/sysdeps/unix/sysv/linux/arc/localplt.data b/sysdeps/unix/sysv/linux/arc/localplt.data
> index 4479e8ee8a..ac5332caf7 100644
> --- a/sysdeps/unix/sysv/linux/arc/localplt.data
> +++ b/sysdeps/unix/sysv/linux/arc/localplt.data
> @@ -1,6 +1,5 @@
>  libc.so: realloc
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: calloc
>  libc.so: free
>  # At -Os, a struct assignment in libgcc-static pulls this in
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/arm/be/libc_malloc_debug.abilist
> index c90d894b22..97b470a989 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.4 mcheck_check_all F
>  GLIBC_2.4 mcheck_pedantic F
>  GLIBC_2.4 memalign F
>  GLIBC_2.4 mprobe F
> +GLIBC_2.4 mtrace F
> +GLIBC_2.4 muntrace F
>  GLIBC_2.4 posix_memalign F
>  GLIBC_2.4 pvalloc F
>  GLIBC_2.4 realloc F
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/arm/le/libc_malloc_debug.abilist
> index c90d894b22..97b470a989 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.4 mcheck_check_all F
>  GLIBC_2.4 mcheck_pedantic F
>  GLIBC_2.4 memalign F
>  GLIBC_2.4 mprobe F
> +GLIBC_2.4 mtrace F
> +GLIBC_2.4 muntrace F
>  GLIBC_2.4 posix_memalign F
>  GLIBC_2.4 pvalloc F
>  GLIBC_2.4 realloc F
> diff --git a/sysdeps/unix/sysv/linux/arm/localplt.data b/sysdeps/unix/sysv/linux/arm/localplt.data
> index eb315da2f1..78896444c6 100644
> --- a/sysdeps/unix/sysv/linux/arm/localplt.data
> +++ b/sysdeps/unix/sysv/linux/arm/localplt.data
> @@ -1,7 +1,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: raise
>  libc.so: realloc
>  libm.so: matherr
> diff --git a/sysdeps/unix/sysv/linux/csky/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/csky/libc_malloc_debug.abilist
> index 932cbbd382..eac818b681 100644
> --- a/sysdeps/unix/sysv/linux/csky/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.29 mcheck_check_all F
>  GLIBC_2.29 mcheck_pedantic F
>  GLIBC_2.29 memalign F
>  GLIBC_2.29 mprobe F
> +GLIBC_2.29 mtrace F
> +GLIBC_2.29 muntrace F
>  GLIBC_2.29 posix_memalign F
>  GLIBC_2.29 pvalloc F
>  GLIBC_2.29 realloc F
> diff --git a/sysdeps/unix/sysv/linux/csky/localplt.data b/sysdeps/unix/sysv/linux/csky/localplt.data
> index 0ed8650b65..817ab2659a 100644
> --- a/sysdeps/unix/sysv/linux/csky/localplt.data
> +++ b/sysdeps/unix/sysv/linux/csky/localplt.data
> @@ -4,7 +4,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  # The TLS-enabled version of these functions is interposed from libc.so.
>  ld.so: _dl_signal_error
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/hppa/libc_malloc_debug.abilist
> index 88ed3c09c8..88cdf04cbe 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.2 mcheck_check_all F
>  GLIBC_2.2 mcheck_pedantic F
>  GLIBC_2.2 memalign F
>  GLIBC_2.2 mprobe F
> +GLIBC_2.2 mtrace F
> +GLIBC_2.2 muntrace F
>  GLIBC_2.2 posix_memalign F
>  GLIBC_2.2 pvalloc F
>  GLIBC_2.2 realloc F
> diff --git a/sysdeps/unix/sysv/linux/hppa/localplt.data b/sysdeps/unix/sysv/linux/hppa/localplt.data
> index 09893d4dcf..baf857a750 100644
> --- a/sysdeps/unix/sysv/linux/hppa/localplt.data
> +++ b/sysdeps/unix/sysv/linux/hppa/localplt.data
> @@ -4,7 +4,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libc.so: __sigsetjmp
>  libc.so: _IO_funlockfile
> diff --git a/sysdeps/unix/sysv/linux/i386/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/i386/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/i386/localplt.data b/sysdeps/unix/sysv/linux/i386/localplt.data
> index 5334875b4b..f9bf7fb410 100644
> --- a/sysdeps/unix/sysv/linux/i386/localplt.data
> +++ b/sysdeps/unix/sysv/linux/i386/localplt.data
> @@ -4,7 +4,6 @@ libc.so: _Unwind_Find_FDE + REL R_386_GLOB_DAT
>  libc.so: calloc + REL R_386_GLOB_DAT
>  libc.so: free + REL R_386_GLOB_DAT
>  libc.so: malloc + REL R_386_GLOB_DAT
> -libc.so: memalign + REL R_386_GLOB_DAT
>  libc.so: realloc + REL R_386_GLOB_DAT
>  libm.so: matherr + REL R_386_GLOB_DAT
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/ia64/libc_malloc_debug.abilist
> index bc8a2be276..ee940be29a 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.2 mcheck_check_all F
>  GLIBC_2.2 mcheck_pedantic F
>  GLIBC_2.2 memalign F
>  GLIBC_2.2 mprobe F
> +GLIBC_2.2 mtrace F
> +GLIBC_2.2 muntrace F
>  GLIBC_2.2 posix_memalign F
>  GLIBC_2.2 pvalloc F
>  GLIBC_2.2 realloc F
> diff --git a/sysdeps/unix/sysv/linux/ia64/localplt.data b/sysdeps/unix/sysv/linux/ia64/localplt.data
> index 1c566a503e..174fb88128 100644
> --- a/sysdeps/unix/sysv/linux/ia64/localplt.data
> +++ b/sysdeps/unix/sysv/linux/ia64/localplt.data
> @@ -1,7 +1,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  libm.so: matherrf
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc_malloc_debug.abilist
> index c90d894b22..97b470a989 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.4 mcheck_check_all F
>  GLIBC_2.4 mcheck_pedantic F
>  GLIBC_2.4 memalign F
>  GLIBC_2.4 mprobe F
> +GLIBC_2.4 mtrace F
> +GLIBC_2.4 muntrace F
>  GLIBC_2.4 posix_memalign F
>  GLIBC_2.4 pvalloc F
>  GLIBC_2.4 realloc F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data
> index 3c5efb7204..42fa90508c 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data
> @@ -2,7 +2,6 @@ libc.so: __m68k_read_tp
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data
> index 843f4e25f2..34bd4c1aca 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data
> @@ -3,7 +3,6 @@ libc.so: __m68k_read_tp
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc_malloc_debug.abilist
> index 0502f3001e..48db59ebb1 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.18 mcheck_check_all F
>  GLIBC_2.18 mcheck_pedantic F
>  GLIBC_2.18 memalign F
>  GLIBC_2.18 mprobe F
> +GLIBC_2.18 mtrace F
> +GLIBC_2.18 muntrace F
>  GLIBC_2.18 posix_memalign F
>  GLIBC_2.18 pvalloc F
>  GLIBC_2.18 realloc F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc_malloc_debug.abilist
> index 0502f3001e..48db59ebb1 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.18 mcheck_check_all F
>  GLIBC_2.18 mcheck_pedantic F
>  GLIBC_2.18 memalign F
>  GLIBC_2.18 mprobe F
> +GLIBC_2.18 mtrace F
> +GLIBC_2.18 muntrace F
>  GLIBC_2.18 posix_memalign F
>  GLIBC_2.18 pvalloc F
>  GLIBC_2.18 realloc F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/localplt.data b/sysdeps/unix/sysv/linux/microblaze/localplt.data
> index 0e98d5251e..c3801314c9 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/localplt.data
> +++ b/sysdeps/unix/sysv/linux/microblaze/localplt.data
> @@ -2,7 +2,6 @@ libc.so: __errno_location
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # The dynamic loader needs __tls_get_addr for TLS.
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc_malloc_debug.abilist
> index 5fe020dca6..fa8beb5e83 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/nios2/libc_malloc_debug.abilist
> index 3a4599773d..3a3f0a2861 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.21 mcheck_check_all F
>  GLIBC_2.21 mcheck_pedantic F
>  GLIBC_2.21 memalign F
>  GLIBC_2.21 mprobe F
> +GLIBC_2.21 mtrace F
> +GLIBC_2.21 muntrace F
>  GLIBC_2.21 posix_memalign F
>  GLIBC_2.21 pvalloc F
>  GLIBC_2.21 realloc F
> diff --git a/sysdeps/unix/sysv/linux/nios2/localplt.data b/sysdeps/unix/sysv/linux/nios2/localplt.data
> index b37987c7c0..17fcfdd4db 100644
> --- a/sysdeps/unix/sysv/linux/nios2/localplt.data
> +++ b/sysdeps/unix/sysv/linux/nios2/localplt.data
> @@ -6,7 +6,6 @@ libc.so: __gedf2
>  libc.so: malloc
>  libc.so: __gtsf2 ?
>  libc.so: __nesf2
> -libc.so: memalign
>  libc.so: __mulsf3
>  libc.so: __floatunsisf
>  libc.so: __addsf3
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data
> index a02dd5cc24..c0af84eef7 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data
> @@ -2,7 +2,6 @@ libc.so: _Unwind_Find_FDE
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data
> index d8072597b7..581e54b95c 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data
> @@ -30,7 +30,6 @@ libc.so: abort ?
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: memset ?
>  libc.so: realloc
>  libm.so: copysignl ?
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc_malloc_debug.abilist
> index 0696d526d4..9e0c7a48c0 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.3 mcheck_check_all F
>  GLIBC_2.3 mcheck_pedantic F
>  GLIBC_2.3 memalign F
>  GLIBC_2.3 mprobe F
> +GLIBC_2.3 mtrace F
> +GLIBC_2.3 muntrace F
>  GLIBC_2.3 posix_memalign F
>  GLIBC_2.3 pvalloc F
>  GLIBC_2.3 realloc F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc_malloc_debug.abilist
> index cc6531b017..bf543ed1e0 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.17 mcheck_check_all F
>  GLIBC_2.17 mcheck_pedantic F
>  GLIBC_2.17 memalign F
>  GLIBC_2.17 mprobe F
> +GLIBC_2.17 mtrace F
> +GLIBC_2.17 muntrace F
>  GLIBC_2.17 posix_memalign F
>  GLIBC_2.17 pvalloc F
>  GLIBC_2.17 realloc F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data
> index bb498fbe3a..d69b7ae646 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data
> @@ -1,7 +1,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/riscv/localplt.data b/sysdeps/unix/sysv/linux/riscv/localplt.data
> index 0a235592c3..e6d5330d5b 100644
> --- a/sysdeps/unix/sysv/linux/riscv/localplt.data
> +++ b/sysdeps/unix/sysv/linux/riscv/localplt.data
> @@ -4,7 +4,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: memset ?
>  libc.so: realloc
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc_malloc_debug.abilist
> index 4ded2f9640..e2448d7b83 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.33 mcheck_check_all F
>  GLIBC_2.33 mcheck_pedantic F
>  GLIBC_2.33 memalign F
>  GLIBC_2.33 mprobe F
> +GLIBC_2.33 mtrace F
> +GLIBC_2.33 muntrace F
>  GLIBC_2.33 posix_memalign F
>  GLIBC_2.33 pvalloc F
>  GLIBC_2.33 realloc F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc_malloc_debug.abilist
> index f878912895..622ee2e67a 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.27 mcheck_check_all F
>  GLIBC_2.27 mcheck_pedantic F
>  GLIBC_2.27 memalign F
>  GLIBC_2.27 mprobe F
> +GLIBC_2.27 mtrace F
> +GLIBC_2.27 muntrace F
>  GLIBC_2.27 posix_memalign F
>  GLIBC_2.27 pvalloc F
>  GLIBC_2.27 realloc F
> diff --git a/sysdeps/unix/sysv/linux/s390/localplt.data b/sysdeps/unix/sysv/linux/s390/localplt.data
> index a02dd5cc24..c0af84eef7 100644
> --- a/sysdeps/unix/sysv/linux/s390/localplt.data
> +++ b/sysdeps/unix/sysv/linux/s390/localplt.data
> @@ -2,7 +2,6 @@ libc.so: _Unwind_Find_FDE
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc_malloc_debug.abilist
> index bc8a2be276..ee940be29a 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.2 mcheck_check_all F
>  GLIBC_2.2 mcheck_pedantic F
>  GLIBC_2.2 memalign F
>  GLIBC_2.2 mprobe F
> +GLIBC_2.2 mtrace F
> +GLIBC_2.2 muntrace F
>  GLIBC_2.2 posix_memalign F
>  GLIBC_2.2 pvalloc F
>  GLIBC_2.2 realloc F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/sh/be/libc_malloc_debug.abilist
> index 88ed3c09c8..88cdf04cbe 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.2 mcheck_check_all F
>  GLIBC_2.2 mcheck_pedantic F
>  GLIBC_2.2 memalign F
>  GLIBC_2.2 mprobe F
> +GLIBC_2.2 mtrace F
> +GLIBC_2.2 muntrace F
>  GLIBC_2.2 posix_memalign F
>  GLIBC_2.2 pvalloc F
>  GLIBC_2.2 realloc F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/sh/le/libc_malloc_debug.abilist
> index 88ed3c09c8..88cdf04cbe 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.2 mcheck_check_all F
>  GLIBC_2.2 mcheck_pedantic F
>  GLIBC_2.2 memalign F
>  GLIBC_2.2 mprobe F
> +GLIBC_2.2 mtrace F
> +GLIBC_2.2 muntrace F
>  GLIBC_2.2 posix_memalign F
>  GLIBC_2.2 pvalloc F
>  GLIBC_2.2 realloc F
> diff --git a/sysdeps/unix/sysv/linux/sh/localplt.data b/sysdeps/unix/sysv/linux/sh/localplt.data
> index 3225177c50..6491b9e37b 100644
> --- a/sysdeps/unix/sysv/linux/sh/localplt.data
> +++ b/sysdeps/unix/sysv/linux/sh/localplt.data
> @@ -4,7 +4,6 @@
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libc.so: _Unwind_Find_FDE
>  libc.so: _exit
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc_malloc_debug.abilist
> index c847b1ee49..96955644d5 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc_malloc_debug.abilist
> @@ -8,6 +8,8 @@ GLIBC_2.0 malloc F
>  GLIBC_2.0 mcheck F
>  GLIBC_2.0 memalign F
>  GLIBC_2.0 mprobe F
> +GLIBC_2.0 mtrace F
> +GLIBC_2.0 muntrace F
>  GLIBC_2.0 pvalloc F
>  GLIBC_2.0 realloc F
>  GLIBC_2.0 valloc F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data
> index be51efd566..38309a1393 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data
> @@ -16,7 +16,6 @@ libc.so: _Unwind_Find_FDE
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc_malloc_debug.abilist
> index bc8a2be276..ee940be29a 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.2 mcheck_check_all F
>  GLIBC_2.2 mcheck_pedantic F
>  GLIBC_2.2 memalign F
>  GLIBC_2.2 mprobe F
> +GLIBC_2.2 mtrace F
> +GLIBC_2.2 muntrace F
>  GLIBC_2.2 posix_memalign F
>  GLIBC_2.2 pvalloc F
>  GLIBC_2.2 realloc F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data
> index 809062d46c..6a216f3a5a 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data
> @@ -15,7 +15,6 @@ libc.so: _Unwind_Find_FDE
>  libc.so: calloc
>  libc.so: free
>  libc.so: malloc
> -libc.so: memalign
>  libc.so: realloc
>  libm.so: matherr
>  # The TLS-enabled version of these functions is interposed from libc.so.
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc_malloc_debug.abilist
> index 3fa0aa3cc3..e734b8f088 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.2.5 mcheck_check_all F
>  GLIBC_2.2.5 mcheck_pedantic F
>  GLIBC_2.2.5 memalign F
>  GLIBC_2.2.5 mprobe F
> +GLIBC_2.2.5 mtrace F
> +GLIBC_2.2.5 muntrace F
>  GLIBC_2.2.5 posix_memalign F
>  GLIBC_2.2.5 pvalloc F
>  GLIBC_2.2.5 realloc F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc_malloc_debug.abilist
> index 4c213fcbef..14efc6602f 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc_malloc_debug.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc_malloc_debug.abilist
> @@ -11,6 +11,8 @@ GLIBC_2.16 mcheck_check_all F
>  GLIBC_2.16 mcheck_pedantic F
>  GLIBC_2.16 memalign F
>  GLIBC_2.16 mprobe F
> +GLIBC_2.16 mtrace F
> +GLIBC_2.16 muntrace F
>  GLIBC_2.16 posix_memalign F
>  GLIBC_2.16 pvalloc F
>  GLIBC_2.16 realloc F
> diff --git a/sysdeps/x86_64/localplt.data b/sysdeps/x86_64/localplt.data
> index 8f41e92870..d1f2e26612 100644
> --- a/sysdeps/x86_64/localplt.data
> +++ b/sysdeps/x86_64/localplt.data
> @@ -6,7 +6,6 @@
>  libc.so: calloc + RELA R_X86_64_GLOB_DAT
>  libc.so: free + RELA R_X86_64_GLOB_DAT
>  libc.so: malloc + RELA R_X86_64_GLOB_DAT
> -libc.so: memalign + RELA R_X86_64_GLOB_DAT
>  libc.so: realloc + RELA R_X86_64_GLOB_DAT
>  libm.so: matherr + RELA R_X86_64_GLOB_DAT
>  # The TLS-enabled version of these functions is interposed from libc.so.
> 

OK.

-- 
Cheers,
Carlos.



More information about the Libc-alpha mailing list