加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

(转)linux下钩子函数 关于内存函数

(2013-05-09 02:32:16)
标签:

it

转自:http://bise.aliapp.com/?p=59

转载者注:该程序在ubuntu 12.04下无法运行 需要修改
void (*__malloc_initialize_hook) (void) = my_mempool_init;
void (*volatile __malloc_initialize_hook) (void) = my_mempool_init;


何谓钩子函数,当一个函数挂载了钩子函数后,你执行这个函数时,实际执行的是钩子函数。
linux下内存函数可以定义自己的钩子函数,好像网络通讯库函数也可以。
下面,我们来看内存函数的钩子函数,首先看定义(在/usr/include/malloc.h里)

1
2
3
4
5
6
7
8
9
10
11
12
13
extern void (*__malloc_initialize_hook) __MALLOC_PMT ((void));

extern void (*__free_hook) __MALLOC_PMT ((void *__ptr,
                               __const __malloc_ptr_t));
extern void *(*__malloc_hook) __MALLOC_PMT ((size_t __size,
                                 __const __malloc_ptr_t));
extern void *(*__realloc_hook) __MALLOC_PMT ((void *__ptr, 
                 size_t __size,  __const __malloc_ptr_t));
extern void *(*__memalign_hook) __MALLOC_PMT ((
                                    size_t __alignment,
                                     size_t __size,
                                __const __malloc_ptr_t));
extern void (*__after_morecore_hook) __MALLOC_PMT ((void));

接下来看我写的一个实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include
#include
#include

static void (*old_free)(void *ptr, const void *caller);
static void *(*old_malloc)(size_t size, const void *caller);

static void my_free(void *ptr, const void *caller);
static void *my_malloc(size_t size, const void *caller);

static void hook_back()
{
    old_malloc = __malloc_hook;
    old_free = __free_hook;
}

static void hook_init()
{
    __malloc_hook = my_malloc;
    __free_hook = my_free;
}

static void hook_restore()
{
    __malloc_hook = old_malloc;
    __free_hook = old_free;
}

static void my_free(void *ptr, const void *caller)
{
    hook_restore();// 这里必须,不然会死循环
    printf("free address: %x\n", ptr);
    free(ptr);
    hook_init();
    return;
}

static void *my_malloc(size_t size, const void *caller)
{
    void *= NULL;
    hook_restore();// 这里必须,不然会死循环
    printf("malloc size: %d\n", size);
   = malloc(size);
    hook_init();
    return p;
}

static void my_mempool_destroy()
{
    hook_restore();
}

static void my_mempool_init()
{
    hook_back();
    hook_init();
    atexit(my_mempool_destroy);
}

void (*__malloc_initialize_hook) (void) = my_mempool_init;
int main(int argc, char **argv)
{
    void *= malloc(12);
    if (!= NULL)
        free(p);
    return 0;
}

输出结果为

1
2
malloc size: 12
free address: 12cba010

明显执行了钩子函数!



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有