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 をラップするには、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 に答える