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