Я столкнулся с небольшой проблемой при мониторинге malloc и free из-за использования интерпозиции функций.
При выполнении интерпозиции функции только для malloc она работает так, как ожидалось. Однако при попытке вставить free он также зацикливается; мне кажется, что бесплатно вызывается рекурсивно, но я просто не знаю, почему.
Это код функций malloc и free. (mod_malloc_free.c)
#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>
void* malloc(size_t size) {
static void* (*real_malloc)(size_t) = NULL;
printf("%s\n", "inside shared malloc");
if(!real_malloc)
real_malloc = dlsym(RTLD_NEXT, "malloc");
void * p = real_malloc(size);
printf("malloc(%d) = %p\n",size, p );
printf("%s\n", "returning from shared malloc");
return p;
}
void free(void* ap ) {
static void (*real_free)(void*) = NULL;
printf("inside shared free...\n");
if(!real_free)
real_free = dlsym(RTLD_NEXT, "free");
printf("free = %p\n", ap);
real_free(ap);
}
Основная просто состоит из:
#include <stdio.h>
#include <malloc.h>
int main(void) {
void * p = malloc(123);
printf("p = %p\n",p );
free(p);
return 0;
}
Скомпилировано как:
gcc -shared -ldl -fPIC mod_malloc_free.c -o libcustom.so
gcc -o smallMain -Стена smallMain.c
LD_PRELOAD=./libcustom.so ./smallMain
С наилучшими пожеланиями
Найфикен
dlsym
звонит бесплатно... ;) - person Mats Petersson   schedule 21.02.2013printf()
может позвонитьmalloc()
иfree()
. Это, скорее всего, происходит (следовательно, рекурсивныйfree()
) - person Hasturkun   schedule 21.02.2013