исправление рекурсивного вызова malloc с помощью LD_PRELOAD

Я использую LD_PRELOAD для регистрации вызовов malloc из приложения и отображения виртуального адресного пространства, однако malloc используется внутри fopen / printf. Есть ли способ, как я могу решить эту проблему?

Я знаю о хуках glibc, но я хочу избежать изменения исходного кода приложения.

0

Решение

Моя проблема была вызвана тем фактом, что 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]

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]