How to use __malloc_hook?

The GNU C library reference guide has an example program (p. 65), but I don’t know what the three sentences are: __malloc_hook = old_malloc_hook; old_malloc_hook = __malloc_hook; __malloc_hook = my_malloc_hook; I mean. Especially the second, who can explain to me? thanks.

static void *
my_malloc_hook (size_t size, const void *caller)
{
    void *result;
    /* Restore all old hooks */
    __malloc_hook = old_malloc_hook;
    __free_hook = old_free_hook;
    /* Call recursively */
    result = malloc (size);
    /* Save underlying hooks */
    old_malloc_hook = __malloc_hook;
    old_free_hook = __free_hook;
    /* printf might call malloc, so protect it too. */
    printf ("malloc (%u) returns %p\n", (unsigned int) size, result);
    /* Restore our own hooks */
    __malloc_hook = my_malloc_hook;
    __free_hook = my_free_hook;
    return result;
}

I am writing a small program to test it:

#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;

        printf("1: __malloc_hook = %x  old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
    /* Call recursively */
    result = malloc(size);

        printf("2: __malloc_hook = %x  old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);


    /* Save underlying hooks */
    old_malloc_hook = __malloc_hook;

        printf("3: __malloc_hook = %x  old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
    /* printf() might call malloc(), so protect it too. */
    printf("malloc(%u) called from %p returns %p\n",
           (unsigned int)size, caller, result);

    /* Restore our own hooks */
    __malloc_hook = my_malloc_hook;
        printf("4: __malloc_hook = %x  old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);

    return result;
}

int main(void)
{
        char *p;
        p = malloc(10);
        free(p);
        return 0;
}

program result:

1: __malloc_hook = 0  old_malloc_hook = 0
2: __malloc_hook = 0  old_malloc_hook = 0
3: __malloc_hook = 0  old_malloc_hook = 0
malloc(10) called from 0xb7797f38 returns 0x932c008
4: __malloc_hook = 804849d  old_malloc_hook = 0

but now I have more problems, why is old_malloc_hookeverything 0, at 1,2,3, why __malloc_hookare 0 equal? I'm really confused. Help me.

+2
source share
3 answers

As far as I can tell, everything works exactly as expected, and the output is perfect.

The variable,, __malloc_hookis 0 (or null), probably because, by default, the system does not have a malloc hook.

, __malloc_hook , , malloc(). /* Restore all old hooks */. , , malloc null, , .

, , , . , , , , . (, , .)

+4

.

  • old_malloc_hook = __malloc_hook;: malloc old_malloc_hook. , , .

  • __malloc_hook = my_malloc_hook;: malloc my_malloc_hook.

  • __malloc_hook = old_malloc_hook;: malloc , , , old_malloc_hook.

+3

I think these answers are missing:

old_malloc_hookat the beginning NULL, and then malloc_hook = old_malloc_hookensures that the hook is disabled, and we do not infinitely recursively call the function of the actual library mallocinside the function my_malloc_hook.

0
source

All Articles