Я хочу переопределить выделение памяти в моей программе на Mac OS 10.9 с помощью DYLD_INSERT_LIBRARIES. Это очень простой скелет кода, который я реализовал:
void *(*default_malloc)(size_t) = NULL;
void (*default_free)() = NULL;
void *(*default_calloc)(size_t, size_t) = NULL;
void *(*default_realloc)(void *, size_t) = NULL;
void *malloc(size_t size)
{
if(!default_malloc)
{
default_malloc = dlsym(RTLD_NEXT, "malloc");
}
size_t allocSize = size + 16;
char *mem = (char *)default_malloc(allocSize);
malloc_printf("malloc returned %p\n", mem + 16);
return mem + 16;
}
void *calloc(size_t num, size_t size)
{
if(!default_calloc)
{
default_calloc = dlsym(RTLD_NEXT, "calloc");
}
void *p = malloc(num*size);
memset(p, 0, num*size);
malloc_printf("calloc function returned %p\n", p);
return p;
}
void *realloc(void *xp, size_t size)
{
if(!default_realloc)
{
default_realloc = dlsym(RTLD_NEXT, "realloc");
}
char *p = (char *)default_realloc((char *)xp - 16, size + 16);
malloc_printf("realloc function returned %p\n", p + 16);
return p + 16;
}
void free(void *buff)
{
if(buff == NULL)
return;
if(!default_free)
{
default_free = dlsym(RTLD_NEXT, "free");
}
char *mem = buff;
malloc_printf("free function called for %p\n", mem);
default_free(mem - 16);
}
Я не уверен, что здесь не так. Когда я запускаю свою программу с ней, я получаю следующий вывод:
$ DYLD_INSERT_LIBRARIES=lib_overrides.dylib ls
ls(2431) malloc: malloc returned 0x7fa6b0400030
ls(2431) malloc: malloc returned 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b0400110
ls(2431) malloc: malloc returned 0x7fa6b0400130
ls(2431) malloc: free function called for 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b04003c0
ls(2431) malloc: free function called for 0x7fa6b04003e0
ls(2431) malloc: *** error for object 0x7fa6b04003e0: pointer being freed was not allocated
Как free
получить указатель 0x7fa6b04003e0
? Он не возвращается malloc
нигде, как предлагают журналы. Я много раз проверял код, но не смог найти проблему. Буду признателен за любую оказанную помощь. Незлая помощь.
ПРИМЕЧАНИЕ. Если я перестаю добавлять 16 из функций распределения и вычитаю 16 из бесплатных, то все будет хорошо. Значит ли это, что есть некоторая другая функция распределения, которая здесь не переопределяется (кроме malloc/calloc/realloc)?
realloc и free can и будут вызываться с нулевыми указателями. И, очевидно, вы столкнулись с проблемами с чем-либо, что было выделено раньше и освобождено после установки этих функций.
Посмотрите на инструменты и функции отладки.