[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