首页 > 解决方案 > 通过共享库替换 malloc

问题描述

我正在 Unix 环境中开发一个基于 cmake 的项目。我创建了一个共享库myMalloc.so,在其中定义了自己的 malloc/free/realloc 等:

//   myMalloc.cpp

extern "C" __typeof (malloc) __libc_malloc;
extern "C" {

void* malloc( size_t _size )
{
    /*some code that allows me to determine if this version of malloc was called*/
    return __libc_malloc( _size );
}
}

其他一些共享库proxy.somyMalloc.so. 最后proxy.so与可执行二进制文件链接。

问题是在可执行文件中使用了默认的 glibc malloc,而不是我自己的 malloc。


我尝试将以下标志添加到多个不同的 CMakeLists.txt 文件中

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")

但这没有帮助。


我已经检查readelf -Ws myMalloc.so并可以看到我的 malloc 版本标记为 GLOBAL,显示在任何其他 malloc 之前

58: 0000000000017110    79 FUNC    GLOBAL DEFAULT   11 malloc
255: 0000000000017110    79 FUNC    GLOBAL DEFAULT   11 malloc
304: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_malloc

然后我检查了一下readelf -Ws proxy.so,可悲的是,glibc malloc 比我的自定义 malloc 更早可见(我猜这意味着 glibc 版本将是首选)

72: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND malloc@GLIBC_2.2.5 (10)
450: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND malloc

readelf -Ws在可执行文件上没有列出任何版本的 malloc


编译myMalloc为静态库没有帮助,但同时编译myMalloc和编译proxy为静态库似乎有帮助(malloc 在可执行文件的符号表上也可见)。

可悲的是,这不是一个选项,这些库需要保持共享,我不能使用 LD_PRELOAD 技巧


有什么问题?我猜想其他一些使用 glibc malloc 的库之前已链接,但我不知道如何解决这个问题。我希望前面提到的 cmake 中的标志会有所帮助,但显然它们没有。

我花了几天时间在互联网上挖掘这个,因为我的 makefile/链接器知识有些有限,找不到更多信息,我会很感激任何建议。


编辑:我看不到标记的重复问题如何回答我的问题。我有一个与共享库相关的特定问题,而重复中甚至没有提到链接。

标签: c++cmakemallocshared-libraries

解决方案


推荐阅读