如何用代码替换默认的malloc

时间:2013-01-05 03:51:56

标签: malloc

我想替换默认的malloc并添加一些统计信息以及泄漏检测和malloc函数的其他行为。我见过一些其他的信息,比如gperftool和jemlloc。他们可以通过链接静态库来替换默认的malloc。他们怎么能这样做?我想实现我的自定义malloc函数。

1 个答案:

答案 0 :(得分:2)

你可以环绕原始的malloc。

static void* (*r_malloc)(size_t) = NULL;

void initialize() {
    r_malloc = dlsym(RTLD_NEXT, "malloc");
}
void* malloc(size_t size) {
    //Do whatever you want
    return r_malloc(bsize);
}

但是不要忘记你也必须包装calloc和realloc。并且libc中也常用的函数用于分配内存。

要包装calloc,你需要做一个脏黑客,因为dlsym尝试使用calloc分配内存,但实际上不需要它。

static void* __temporary_calloc(size_t x __attribute__((unused)), size_t y __attribute__((unused))) {
    return NULL;
}
static void* (*r_calloc)(size_t,size_t) = NULL;

并在init函数中添加:

r_calloc = __temporary_calloc;
r_calloc = dlsym(RTLD_NEXT, "calloc");