c++ - 在 macOS 上覆盖 malloc

标签 c++ c osx-mavericks llvm-gcc

我想使用 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 并从空闲中减去 16,那么一切都会正常。那么这是否意味着还有一些其他分配函数没有在这里被重写(除了 malloc/calloc/realloc 之外)?

最佳答案

我遇到了同样的问题,我通过检查指针是否已在 free 函数中分配来解决。

由于某些原因我必须使用

DYLD_INSERT_LIBRARIES=/path/to/dylib DYLD_FORCE_FLAT_NAMESPACE=1 ls

也许这可以帮助一些人。

我相信这些传递给 free 的指针是在动态链接器加载 dylib 之前由“真正的 malloc”进行的分配。

关于c++ - 在 macOS 上覆盖 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22105511/

相关文章:

c++ - 访问冲突循环和写入

c++ - MPI读取目录中的所有文件

c# - 在托管代码(C++、C、C++/CLI、C#)中使用非托管代码时处理错误

c - 先前的堆栈变量

c - Mac OS X 上的原生 PNG 库 (mavericks)

内核 CUDA 中的 C++ 代码?

使用 C 控制键盘 LED 灯

枚举的组成

macos - Mac OS 10.9 上的 QMetaObject::changeGuard 崩溃

xcode5 - xcode5.0.1 + mac os 10.9 的协同设计错误