我正在使用LD_PRELOAD来记录来自应用程序的malloc调用并映射出虚拟地址空间,但是malloc由fopen / printf在内部使用。有没有办法解决这个问题?
我知道glibc的钩子,但我想避免更改应用程序的源代码。
答案 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;
}