Problem in overriding malloc

后端 未结 9 2160
一整个雨季
一整个雨季 2020-12-30 09:24

I am trying to override malloc by doing this.

#define malloc(X) my_malloc((X))

void* my_malloc(size_t size)
{

    void *p = malloc(size);
    printf (\"All         


        
9条回答
  •  不知归路
    2020-12-30 09:35

    With Glibc, there exists malloc_hook(3) as the proper way to globally interpose your own malloc function.

    #include 
    #include 
    
    static void *(*old_malloc_hook)(size_t, const void *);
    
    static void *new_malloc_hook(size_t size, const void *caller) {
        void *mem;
    
        __malloc_hook = old_malloc_hook;
        mem = malloc(size);
        fprintf(stderr, "%p: malloc(%zu) = %p\n", caller, size, mem);
        __malloc_hook = new_malloc_hook;
    
        return mem;
    }
    
    static void init_my_hooks(void) {
        old_malloc_hook = __malloc_hook;
        __malloc_hook = new_malloc_hook;
    }
    
    void (*__malloc_initialize_hook)(void) = init_my_hooks;
    
    $ cat >mem.c <<'EOF'
    (the code above)
    EOF
    $ cat >main.c <<'EOF'
    #include 
    #include 
    int main() {
        char *buf = malloc(50);
        sprintf(buf, "Hello, world!");
        puts(buf);
        free(buf);
        return 0;
    }
    EOF
    $ cc mem.c main.c
    $ ./a.out
    0x40077e: malloc(50) = 0x22f7010
    Hello, world!
    

    (We could use __attribute__((constructor)), but that trick isn't necessary: Glibc handily provides __malloc_initialize_hook as another way to load run code before main.)

提交回复
热议问题