Я использую LD_PRELOAD для регистрации вызовов malloc из приложения и отображения виртуального адресного пространства, однако malloc используется внутри fopen / printf. Есть ли способ, как я могу решить эту проблему?
Я знаю о хуках glibc, но я хочу избежать изменения исходного кода приложения.
Моя проблема была вызвана тем фактом, что malloc используется внутренне glibc, поэтому, когда я использую LD_PRELOAD для переопределения malloc, любая попытка записи привела к вызову malloc, что привело к рекурсивному вызову самого malloc
Решение:
вызывать оригинальный malloc всякий раз, когда TLS требует выделения памяти
предоставление кода:
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;
}
[/ NOEDIT]
Других решений пока нет …