我想替换默认的 malloc 并添加一些统计信息以及泄漏检测和其他对 malloc 函数的行为。我见过一些其他的实现,比如 gperftool 和 jemlloc。他们可以通过链接到他们的静态库来替换默认的 malloc。他们怎么能这样做?我想像这样实现我的自定义 malloc 函数。
问问题
2818 次
1 回答
4
您可以环绕原来的 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,您需要做一个肮脏的 hack,因为 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");
于 2013-01-05T09:49:07.503 回答