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

Carlos O'Donell carlos@redhat.com
Fri Jul 2 19:06:56 GMT 2021


On 7/2/21 7:38 AM, Siddhesh Poyarekar wrote:
> Split mtrace hooks into before and after and adapt to the new internal
> debugging hooks infrastructure.  With this, the malloc hooks are
> unused internally and can be removed from the main library.

LGTM.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
 
> This also eliminates the only use of memalign through a PLT in the
> library, so checklocalplt data needs to be updated to reflect that.
> ---
>  include/malloc.h                              |   1 +
>  malloc/hooks.c                                |  40 ++-
>  malloc/mtrace-hooks.c                         | 137 ++++++++++
>  malloc/mtrace.c                               | 233 +-----------------
>  sysdeps/generic/localplt.data                 |   1 -
>  sysdeps/mach/hurd/i386/localplt.data          |   1 -
>  sysdeps/unix/sysv/linux/aarch64/localplt.data |   1 -
>  sysdeps/unix/sysv/linux/alpha/localplt.data   |   1 -
>  sysdeps/unix/sysv/linux/arc/localplt.data     |   1 -
>  sysdeps/unix/sysv/linux/arm/localplt.data     |   1 -
>  sysdeps/unix/sysv/linux/csky/localplt.data    |   1 -
>  sysdeps/unix/sysv/linux/hppa/localplt.data    |   1 -
>  sysdeps/unix/sysv/linux/i386/localplt.data    |   1 -
>  sysdeps/unix/sysv/linux/ia64/localplt.data    |   1 -
>  .../sysv/linux/m68k/coldfire/localplt.data    |   1 -
>  .../unix/sysv/linux/m68k/m680x0/localplt.data |   1 -
>  .../unix/sysv/linux/microblaze/localplt.data  |   1 -
>  sysdeps/unix/sysv/linux/nios2/localplt.data   |   1 -
>  .../linux/powerpc/powerpc32/fpu/localplt.data |   1 -
>  .../powerpc/powerpc32/nofpu/localplt.data     |   1 -
>  .../linux/powerpc/powerpc64/localplt.data     |   1 -
>  sysdeps/unix/sysv/linux/riscv/localplt.data   |   1 -
>  sysdeps/unix/sysv/linux/s390/localplt.data    |   1 -
>  sysdeps/unix/sysv/linux/sh/localplt.data      |   1 -
>  .../sysv/linux/sparc/sparc32/localplt.data    |   1 -
>  .../sysv/linux/sparc/sparc64/localplt.data    |   1 -
>  sysdeps/x86_64/localplt.data                  |   1 -
>  27 files changed, 182 insertions(+), 252 deletions(-)
>  create mode 100644 malloc/mtrace-hooks.c
> 
> diff --git a/include/malloc.h b/include/malloc.h
> index bb1123d9d3..6169d486f5 100644
> --- a/include/malloc.h
> +++ b/include/malloc.h
> @@ -15,6 +15,7 @@ typedef struct malloc_state *mstate;
>  #define __malloc_initialized __libc_malloc_initialized
>  /* Nonzero if the malloc is already initialized.  */
>  extern int __malloc_initialized attribute_hidden;
> +extern FILE *__mtrace_mallstream attribute_hidden;
>  
>  enum mcheck_status __mcheck_checkptr (const void *) attribute_hidden;
>  extern int __mcheck_initialize (void (*) (enum mcheck_status), bool)
> diff --git a/malloc/hooks.c b/malloc/hooks.c
> index 7b500e5671..7f3b07ca44 100644
> --- a/malloc/hooks.c
> +++ b/malloc/hooks.c
> @@ -37,6 +37,7 @@ enum malloc_debug_hooks
>    MALLOC_NONE_HOOK = 0,
>    MALLOC_CHECK_HOOK = 1 << 0,	/* MALLOC_CHECK_ or glibc.malloc.check.  */
>    MALLOC_MCHECK_HOOK = 1 << 1,	/* mcheck()  */
> +  MALLOC_MTRACE_HOOK = 1 << 2,	/* mtrace()  */
>  };
>  static unsigned __malloc_debugging_hooks;
>  
> @@ -79,6 +80,7 @@ __malloc_debug_disable (enum malloc_debug_hooks flag)
>  
>  #include "malloc-check.c"
>  #include "mcheck-hooks.c"
> +#include "mtrace-hooks.c"
>  
>  static __always_inline bool
>  _malloc_debug_before (size_t *bytesp, void **victimp, const void *address)
> @@ -111,8 +113,13 @@ _malloc_debug_before (size_t *bytesp, void **victimp, const void *address)
>  static __always_inline void *
>  _malloc_debug_after (void *mem, size_t bytes, const void *address)
>  {
> -  if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL)
> -    mem = malloc_mcheck_after (mem, bytes);
> +  if (__glibc_unlikely (__malloc_debugging_hooks))
> +    {
> +      if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL)
> +	mem = malloc_mcheck_after (mem, bytes);
> +      if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +	mem = malloc_mtrace_after (mem, bytes, address);
> +    }
>    return mem;
>  }
>  
> @@ -129,6 +136,8 @@ _free_debug_before (void **mem, const void *address)
>  
>    if (__glibc_unlikely (__malloc_debugging_hooks))
>      {
> +      if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +	free_mtrace (mem, address);
>        if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK))
>  	*mem = free_mcheck (*mem);
>        if (__is_malloc_debug_enabled (MALLOC_CHECK_HOOK))
> @@ -171,8 +180,13 @@ static __always_inline void *
>  _realloc_debug_after (void *mem, void *oldmem, size_t bytes, size_t oldsize,
>  		      const void *address)
>  {
> -  if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL)
> -    mem = realloc_mcheck_after (mem, oldmem, bytes, oldsize);
> +  if (__glibc_unlikely (__malloc_debugging_hooks))
> +    {
> +      if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL)
> +	mem = realloc_mcheck_after (mem, oldmem, bytes, oldsize);
> +      if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +	mem = realloc_mtrace_after (mem, oldmem, bytes, address);
> +    }
>    return mem;
>  }
>  
> @@ -206,8 +220,13 @@ static __always_inline void *
>  _memalign_debug_after (void *mem, size_t alignment, size_t bytes,
>  		       const void *address)
>  {
> -  if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL)
> -    mem = memalign_mcheck_after (mem, alignment, bytes);
> +  if (__glibc_unlikely (__malloc_debugging_hooks))
> +    {
> +      if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL)
> +	mem = memalign_mcheck_after (mem, alignment, bytes);
> +      if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +	mem = memalign_mtrace_after (mem, bytes, address);
> +    }
>    return mem;
>  }
>  
> @@ -244,11 +263,16 @@ _calloc_debug_before (size_t *bytesp, void **victimp, const void *address)
>  static __always_inline void *
>  _calloc_debug_after (void *mem, size_t bytes, const void *address)
>  {
> -  if (__glibc_unlikely (__malloc_debugging_hooks) && mem != NULL)
> +  if (__glibc_unlikely (__malloc_debugging_hooks))
>      {
>        if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK))
>  	mem = malloc_mcheck_after (mem, bytes);
> -      memset (mem, 0, bytes);
> +      if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK))
> +	mem = malloc_mtrace_after (mem, bytes, address);
> +      /* mtrace uses __libc_calloc to do the zeroing.  */
> +      if (mem != NULL && __is_malloc_debug_enabled (MALLOC_CHECK_HOOK
> +						    | MALLOC_MCHECK_HOOK))
> +	memset (mem, 0, bytes);
>      }
>    return mem;
>  }
> diff --git a/malloc/mtrace-hooks.c b/malloc/mtrace-hooks.c
> new file mode 100644
> index 0000000000..c1c6d6a6e9
> --- /dev/null
> +++ b/malloc/mtrace-hooks.c
> @@ -0,0 +1,137 @@
> +
> +# include <libc-lock.h>
> +
> +#include <kernel-features.h>
> +
> +FILE *__mtrace_mallstream;
> +
> +__libc_lock_define_initialized (static, lock);
> +
> +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 (__mtrace_mallstream, "@ %s%s%s[%p] ",
> +                   info->dli_fname ? : "", info->dli_fname ? ":" : "",
> +                   buf, caller);
> +        }
> +      else
> +        fprintf (__mtrace_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 bool
> +free_mtrace (void *ptr, const void *caller)
> +{
> +  if (ptr == NULL)
> +    return true;
> +
> +  Dl_info mem;
> +  Dl_info *info = lock_and_info (caller, &mem);
> +  tr_where (caller, info);
> +  /* Be sure to print it first.  */
> +  fprintf (__mtrace_mallstream, "- %p\n", ptr);
> +  __libc_lock_unlock (lock);
> +
> +  /* Continue on to free.  */
> +  return false;
> +}
> +
> +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 (__mtrace_mallstream, "+ %p %#lx\n", block,
> +	   (unsigned long int) size);
> +
> +  __libc_lock_unlock (lock);
> +
> +  return block;
> +}
> +
> +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 (__mtrace_mallstream, "! %p %#lx\n", oldptr,
> +		 (unsigned long int) size);
> +      else
> +        fprintf (__mtrace_mallstream, "- %p\n", oldptr);
> +    }
> +  else if (oldptr == NULL)
> +    fprintf (__mtrace_mallstream, "+ %p %#lx\n", block,
> +	     (unsigned long int) size);
> +  else
> +    {
> +      fprintf (__mtrace_mallstream, "< %p\n", oldptr);
> +      tr_where (caller, info);
> +      fprintf (__mtrace_mallstream, "> %p %#lx\n", block,
> +	       (unsigned long int) size);
> +    }
> +
> +  __libc_lock_unlock (lock);
> +
> +  return block;
> +}
> +
> +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 (__mtrace_mallstream, "+ %p %#lx\n", block,
> +	   (unsigned long int) size);
> +
> +  __libc_lock_unlock (lock);
> +
> +  return block;
> +}
> diff --git a/malloc/mtrace.c b/malloc/mtrace.c
> index 6c2c58b706..2cc4507e25 100644
> --- a/malloc/mtrace.c
> +++ b/malloc/mtrace.c
> @@ -22,7 +22,6 @@
>  # define _MALLOC_INTERNAL
>  # include <malloc.h>
>  # include <mcheck.h>
> -# include <libc-lock.h>
>  #endif
>  
>  #include <dlfcn.h>
> @@ -35,20 +34,14 @@
>  
>  #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);
> +static const char mallenv[] = "MALLOC_TRACE";
>  
>  #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_34)
>  /* Compatibility symbols that were introduced to help break at allocation sites
> @@ -69,204 +62,6 @@ tr_break (void)
>  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
> @@ -276,7 +71,7 @@ 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)
> +  if (__mtrace_mallstream != NULL)
>      __libc_freeres ();
>  }
>  #endif
> @@ -293,7 +88,7 @@ mtrace (void)
>    char *mallfile;
>  
>    /* Don't panic if we're called more than once.  */
> -  if (mallstream != NULL)
> +  if (__mtrace_mallstream != NULL)
>      return;
>  
>  #ifdef _LIBC
> @@ -310,15 +105,15 @@ mtrace (void)
>        if (mtb == NULL)
>          return;
>  
> -      mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wce");
> -      if (mallstream != NULL)
> +      __mtrace_mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null",
> +				   "wce");
> +      if (__mtrace_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 ();
> +          setvbuf (__mtrace_mallstream, malloc_trace_buffer, _IOFBF,
> +		   TRACE_BUFFER_SIZE);
> +          fprintf (__mtrace_mallstream, "= Start\n");
>  #ifdef _LIBC
>            if (!added_atexit_handler)
>              {
> @@ -336,15 +131,11 @@ mtrace (void)
>  void
>  muntrace (void)
>  {
> -  if (mallstream == NULL)
> +  if (__mtrace_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 ();
> +  FILE *f = __mtrace_mallstream;
> +  __mtrace_mallstream = NULL;
>  
>    fprintf (f, "= End\n");
>    fclose (f);
> 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
>  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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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.
> 


-- 
Cheers,
Carlos.



More information about the Libc-alpha mailing list