[PATCH 6/8] Remove malloc hooks

Siddhesh Poyarekar siddhesh@sourceware.org
Mon Jun 28 06:37:15 GMT 2021


On 6/25/21 5:01 AM, DJ Delorie via Libc-alpha wrote:
>> diff --git a/malloc/hooks.c b/malloc/hooks.c
>> index 492e9aac63..cc9ffc8b63 100644
>> --- a/malloc/hooks.c
>> +++ b/malloc/hooks.c
>> @@ -42,23 +42,84 @@ enum malloc_debug_hooks
>>   static unsigned __malloc_debugging_hooks;
>>   
>>   /* Forward declarations.  */
>> +static void ptmalloc_init (void);
>>   
>> -#if HAVE_MALLOC_INIT_HOOK
>> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_24)
> 
> 2_24?  Not 2_34?

__malloc_initialize_hook was made compat in 2.24.

>>   void (*__malloc_initialize_hook) (void) __attribute__ ((nocommon));
>>   compat_symbol (libc, __malloc_initialize_hook,
>>   	       __malloc_initialize_hook, GLIBC_2_0);
>> +
>> +# define MALLOC_INIT_HOOK() ({ \
>> +  void (*hook) (void) = atomic_forced_read (__malloc_initialize_hook);	      \
>> +  if (hook != NULL)							      \
>> +    (*hook)();								      \
>> +})
>> +#else
>> +# define MALLOC_INIT_HOOK()
>>   #endif
> 
> Ok.
> 
>> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_34)
>> +
>> +static void *malloc_hook_ini (size_t, const void *) __THROW;
>> +static void *realloc_hook_ini (void *, size_t, const void *) __THROW;
>> +static void *memalign_hook_ini (size_t, size_t, const void *) __THROW;
>> +
>>   void weak_variable (*__free_hook) (void *__ptr,
>>                                      const void *) = NULL;
>>   void *weak_variable (*__malloc_hook)
>> -  (size_t __size, const void *) = NULL;
>> +  (size_t __size, const void *) = malloc_hook_ini;
>>   void *weak_variable (*__realloc_hook)
>> -  (void *__ptr, size_t __size, const void *) = NULL;
>> +  (void *__ptr, size_t __size, const void *) = realloc_hook_ini;
>>   void *weak_variable (*__memalign_hook)
>> -  (size_t __alignment, size_t __size, const void *) = NULL;
>> +  (size_t __alignment, size_t __size, const void *) = memalign_hook_ini;
>>   
>> -static void ptmalloc_init (void);
>> +compat_symbol (libc, __free_hook, __free_hook, GLIBC_2_0);
>> +compat_symbol (libc, __malloc_hook, __malloc_hook, GLIBC_2_0);
>> +compat_symbol (libc, __realloc_hook, __realloc_hook, GLIBC_2_0);
>> +compat_symbol (libc, __memalign_hook, __memalign_hook, GLIBC_2_0);
>> +
>> +/* These hooks will get executed only through the interposed allocator
>> +   functions in libmalloc_compathooks.  This means that the calls to malloc,
>> +   realloc, etc. will lead back into the interposed functions, which is what we
>> +   want.
>> +
>> +   These initial hooks are assumed to be called in a single-threaded context,
>> +   so it is safe to reset all hooks at once upon initialization.  */
>> +
>> +static void
>> +generic_hook_ini (void)
>> +{
>> +  __malloc_hook = NULL;
>> +  __realloc_hook = NULL;
>> +  __memalign_hook = NULL;
>> +  if (__malloc_initialized < 0)
>> +    {
>> +      ptmalloc_init ();
>> +      MALLOC_INIT_HOOK ();
>> +    }
>> +}
>> +
>> +static void *
>> +malloc_hook_ini (size_t sz, const void *caller)
>> +{
>> +  generic_hook_ini ();
>> +  return malloc (sz);
>> +}
>> +
>> +static void *
>> +realloc_hook_ini (void *ptr, size_t sz, const void *caller)
>> +{
>> +  generic_hook_ini ();
>> +  return realloc (ptr, sz);
>> +}
>> +
>> +static void *
>> +memalign_hook_ini (size_t alignment, size_t sz, const void *caller)
>> +{
>> +  generic_hook_ini ();
>> +  return memalign (alignment, sz);
>> +}
>> +#endif
> 
> Ok.  Why not free_hook?

free_hook started out as NULL, so there's no need to reset it.  It also 
cannot legitimately be the first malloc function to be called (except 
with NULL, which is a nop anyway)

Siddhesh


More information about the Libc-alpha mailing list