MALLOC_HOOK(3)            (2020-11-01)             MALLOC_HOOK(3)

     NAME
          __malloc_hook, __malloc_initialize_hook, __memalign_hook,
          __free_hook, __realloc_hook, __after_morecore_hook - malloc
          debugging variables

     SYNOPSIS
          #include <malloc.h>

          void *(*__malloc_hook)(size_t size, const void *caller);

          void *(*__realloc_hook)(void *ptr, size_t size, const void *caller

          void *(*__memalign_hook)(size_t alignment, size_t size,
                                   const void *caller);

          void (*__free_hook)(void *ptr, const void *caller);

          void (*__malloc_initialize_hook)(void);

          void (*__after_morecore_hook)(void);

     DESCRIPTION
          The GNU C library lets you modify the behavior of malloc(3),
          realloc(3), and free(3) by specifying appropriate hook func-
          tions.  You can use these hooks to help you debug programs
          that use dynamic memory allocation, for example.

          The variable __malloc_initialize_hook points at a function
          that is called once when the malloc implementation is ini-
          tialized.  This is a weak variable, so it can be overridden
          in the application with a definition like the following:

              void (*__malloc_initialize_hook)(void) = my_init_hook;

          Now the function my_init_hook() can do the initialization of
          all hooks.

          The four functions pointed to by __malloc_hook,
          __realloc_hook, __memalign_hook, __free_hook have a proto-
          type like the functions malloc(3), realloc(3), memalign(3),
          free(3), respectively, except that they have a final argu-
          ment caller that gives the address of the caller of
          malloc(3), etc.

          The variable __after_morecore_hook points at a function that
          is called each time after sbrk(2) was asked for more memory.

     CONFORMING TO
          These functions are GNU extensions.

     Page 1                         GNU              (printed 5/25/22)

     MALLOC_HOOK(3)            (2020-11-01)             MALLOC_HOOK(3)

     NOTES
          The use of these hook functions is not safe in multithreaded
          programs, and they are now deprecated.  From glibc 2.24
          onwards, the __malloc_initialize_hook variable has been
          removed from the API.  Programmers should instead preempt
          calls to the relevant functions by defining and exporting
          functions such as "malloc" and "free".

     EXAMPLES
          Here is a short example of how to use these variables.

          #include <stdio.h>
          #include <malloc.h>

          /* Prototypes for our hooks.  */
          static void my_init_hook(void);
          static void *my_malloc_hook(size_t, const void *);

          /* Variables to save original hooks. */
          static void *(*old_malloc_hook)(size_t, const void *);

          /* Override initializing hook from the C library. */
          void (*__malloc_initialize_hook) (void) = my_init_hook;

          static void
          my_init_hook(void)
          {
              old_malloc_hook = __malloc_hook;
              __malloc_hook = my_malloc_hook;
          }

          static void *
          my_malloc_hook(size_t size, const void *caller)
          {
              void *result;

              /* Restore all old hooks */
              __malloc_hook = old_malloc_hook;

              /* Call recursively */
              result = malloc(size);

              /* Save underlying hooks */
              old_malloc_hook = __malloc_hook;

              /* printf() might call malloc(), so protect it too. */
              printf("malloc(%zu) called from %p returns %p\n",
                      size, caller, result);

              /* Restore our own hooks */
              __malloc_hook = my_malloc_hook;

     Page 2                         GNU              (printed 5/25/22)

     MALLOC_HOOK(3)            (2020-11-01)             MALLOC_HOOK(3)

              return result;
          }

     SEE ALSO
          mallinfo(3), malloc(3), mcheck(3), mtrace(3)

     COLOPHON
          This page is part of release 5.10 of the Linux man-pages
          project.  A description of the project, information about
          reporting bugs, and the latest version of this page, can be
          found at https://www.kernel.org/doc/man-pages/.

     Page 3                         GNU              (printed 5/25/22)