2017-02-20 14 views
0

LD_PRELOADを使用してmalloc呼び出しをアプリケーションからログアウトし、仮想アドレス空間をマップしますが、mallocはfopen/printfによって内部的に使用されます。この問題を解決できる方法はありますか?LD_PRELOADでmallocへの再帰呼び出しを修正しました

私はglibcのフックについて知っていますが、私はアプリケーションのソースコードを変更しないでください。

+0

http://stackoverflow.com/questions/7811656/ld-preload-only-working-for-malloc-not-free:TLSは、メモリ割り当て 提供するコードを必要とするたびに、元のmallocを呼び出しますか? –

+1

あなたが持っている問題を定義してください。説明は再帰について何も言わない。 – yugr

答えて

0

私の問題は、私は再帰呼び出しが生じ呼ばれる原因となったの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; 
} 

+0

ソース:http://www.slideshare.net/tetsu.koba/tips-of-malloc-free – bnm

関連する問題