我想使用DYLD_INSERT_LIBRARIES在Mac OS 10.9上的程序中覆盖内存分配。这是我实现的代码的一个非常简单的框架:
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并从free中减去16,那么一切正常。那么它是否意味着还有一些其他的分配函数在这里没有被覆盖(除了malloc / calloc / realloc)?
答案 0 :(得分:0)
我遇到了同样的问题,我通过检查指针是否已在自由函数中分配来解决。
也因为某些原因我不得不使用
DYLD_INSERT_LIBRARIES=/path/to/dylib DYLD_FORCE_FLAT_NAMESPACE=1 ls
也许可以帮助一些人。
我相信这些传递给 free 的指针是在动态链接器加载您的 dylib 之前由“真正的 malloc”分配的。
答案 1 :(得分:-1)
realloc和free可以并且将使用空指针调用。很明显,你遇到了以前分配的任何问题,并在安装这些功能后释放。
请查看仪器和调试功能。