如何更换的代码默认的malloc(how to replace default malloc by

2019-07-17 20:21发布

我想要替换默认malloc和一些统计数据,以及泄漏检测等品行增加的malloc函数。 我已经看到了一些其他imlementations像gperftool和jemlloc。 他们可以通过与他们的静态库链接替换默认的malloc。 他们怎么能这样做呢? 我想实现这样的我自定义的malloc函数。

Answer 1:

您可以环绕原有的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;

并在初始化函数补充一点:

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


文章来源: how to replace default malloc by code
标签: malloc