LD_PRELOADを使用してmalloc呼び出しをアプリケーションからログアウトし、仮想アドレス空間をマップしますが、mallocはfopen/printfによって内部的に使用されます。この問題を解決できる方法はありますか?LD_PRELOADでmallocへの再帰呼び出しを修正しました
私はglibcのフックについて知っていますが、私はアプリケーションのソースコードを変更しないでください。
LD_PRELOADを使用してmalloc呼び出しをアプリケーションからログアウトし、仮想アドレス空間をマップしますが、mallocはfopen/printfによって内部的に使用されます。この問題を解決できる方法はありますか?LD_PRELOADでmallocへの再帰呼び出しを修正しました
私はglibcのフックについて知っていますが、私はアプリケーションのソースコードを変更しないでください。
私の問題は、私は再帰呼び出しが生じ呼ばれる原因となったのmallocをログに記録するmalloc関数に任意の試みをオーバーライドするためにLD_PRELOADを使用するときに自分自身ををmallocするmalloc関数はglibcのが内部的に使用されているという事実によって引き起こされた
ソリューション:
static __thread int no_hook;
static void *(*real_malloc)(size_t) = NULL;
static void __attribute__((constructor))init(void) {
real_malloc = (void * (*)(size_t))dlsym(RTLD_NEXT, "malloc");
}
void * malloc(size_t len) {
void* ret;
void* caller;
if (no_hook) {
return (*real_malloc)(len);
}
no_hook = 1;
caller = (void*)(long) __builtin_return_address(0);
printf("malloc call %zu from %lu\n", len, (long)caller);
ret = (*real_malloc)(len);
// fprintf(logfp, ") -> %pn", ret);
no_hook = 0;
return ret;
}
ソース:http://www.slideshare.net/tetsu.koba/tips-of-malloc-free – bnm
http://stackoverflow.com/questions/7811656/ld-preload-only-working-for-malloc-not-free:TLSは、メモリ割り当て 提供するコードを必要とするたびに、元のmallocを呼び出しますか? –
あなたが持っている問題を定義してください。説明は再帰について何も言わない。 – yugr