2014-03-01 54 views
0

GNU比如我複製並粘貼從例子malloc__hook: http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html不能編譯malloc__hooks

但噹噹過我嘗試編譯它,有一個錯誤:

hooks.c:17 :8:錯誤:'__malloc_initialize_hook'的衝突類型限定符 從hooks.c中包含的文件:4:0: /usr/include/malloc.h:170:38:注意:'__malloc_initialize_hook'的前一個聲明在這裏

關於什麼可能是錯誤的任何想法?

這裏是我的代碼:

/* Prototypes for __malloc_hook, __free_hook */ 
#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 *); 
static void my_free_hook (void*, const void *); 
static void test(); 

/* Variables to save original hooks. */ 
static void *(*old_malloc_hook) (size_t, const void *); 
static void *(*old_free_hook) (void*, 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; 
    old_free_hook = __free_hook; 
    __malloc_hook = my_malloc_hook; 
    __free_hook = my_free_hook; 
} 

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); 
    test(); 
    /* 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; 
} 

static void my_free_hook (void *ptr, const void *caller) 
{ 
    /* Restore all old hooks */ 
    __malloc_hook = old_malloc_hook; 
    __free_hook = old_free_hook; 
    /* Call recursively */ 
    free (ptr); 
    /* Save underlying hooks */ 
    old_malloc_hook = __malloc_hook; 
    old_free_hook = __free_hook; 
    /* printf might call free, so protect it too. */ 
    printf ("freed pointer %p\n", ptr); 
    test(); 
    /* Restore our own hooks */ 
    __malloc_hook = my_malloc_hook; 
    __free_hook = my_free_hook; 
} 


static void test(){ 
    printf("\ntest function called\n"); 
} 

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

檢查原型的功能使用情況。 – brokenfoot

回答

0

我相信你應該寫:

void (*__MALLOC_HOOK_VOLATILE __malloc_initialize_hook) (void) = my_init_hook; 

不是:

void (*__malloc_initialize_hook) (void) = my_init_hook; 

我測試了這個在Debian喘息,現在編譯。

+0

謝謝你的工作! – user3369317