私が知らないことをやりたいです他のプラットフォームではありますが、GNU/Linuxでは小さなメモリトラッキングライブラリをあらかじめロードすることができますy LD_PRELOAD
自分のmalloc
とfree
が定義されている環境変数。
自分自身のmalloc
は実際の関数を使用してメモリを割り当てたいと思うかもしれないので、ここで再帰的な問題が発生する可能性があります。これを回避するために、dlsym関数は、RTLD_NEXT
引数を使用して、次の(つまり、実際の)malloc
関数へのポインタを取得できます。この
非常に小さなテストには、以下のようになります。私たちは、このファイルfakemalloc.c
を呼び出す場合
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
void *malloc(size_t size)
{
static void *(*real_malloc)(size_t size) = 0;
if (!real_malloc)
real_malloc = dlsym(RTLD_NEXT, "malloc");
void *result = real_malloc(size);
fprintf(stderr, "malloc(%d) = %p\n", (int)size, result);
return result;
}
void free(void *ptr)
{
static void (*real_free)(void *ptr) = 0;
if (!real_free)
real_free = dlsym(RTLD_NEXT, "free");
real_free(ptr);
fprintf(stderr, "free(%p)\n", ptr);
}
、それは
gcc -fPIC -shared -Wl,-soname,fakemalloc.so -o fakemalloc.so fakemalloc.c -ldl
としてコマンドでfakemalloc.so
共有オブジェクトにコンパイルすることができますテストは、ls
コマンドの呼び出しで発生したmalloc
とfree
通話見て、あなたが実行する必要があると思い
LD_PRELOAD=/path/to/fakemalloc.so ls
EDIT:コメントで述べたように、glibcの-システムでは、あなたは機能__libc_malloc
と__libc_free
を使用してRTLD_NEXT
アプローチを回避することができます。ここで問題@Lolrapa
#include <stdio.h>
void *__libc_malloc(size_t size);
void *__libc_free(void *ptr);
void *malloc(size_t size)
{
void *result = __libc_malloc(size);
fprintf(stderr, "malloc(%d) = %p\n", (int)size, result);
return result;
}
void free(void *ptr)
{
__libc_free(ptr);
fprintf(stderr, "free(%p)\n", ptr);
}
出典
2016-12-25 16:00:50
brm
注入された機能は、「malloc関数」として、いくつかの名前を持たなければならないということですが、注入された関数の内部システム「malloc関数」への呼び出しがあります。これは、次のコードを生成しますおそらく無限の再帰関数を生成するでしょうか? –