使用LD_PRELOAD修复对malloc的递归调用

时间:2017-02-20 04:37:24

标签: c++ c ld-preload

我正在使用LD_PRELOAD来记录来自应用程序的malloc调用并映射出虚拟地址空间,但是malloc由fopen / printf在内部使用。有没有办法解决这个问题?

我知道glibc的钩子,但我想避免更改应用程序的源代码。

1 个答案:

答案 0 :(得分:0)

我的问题是由glibc内部使用malloc这一事实造成的,所以当我使用LD_PRELOAD覆盖malloc时,任何尝试记录都会导致调用malloc,从而导致对malloc本身的递归调用

解决方案: 每当TLS需要内存分配时调用原始malloc 提供代码:

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; 
}

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; }