3

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

4

1 回答 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 回答