通过共享库替换malloc

时间:2019-06-14 16:30:21

标签: c++ cmake malloc shared-libraries

我正在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编译为静态库无济于事,但myMallocproxy编译为静态库似乎有帮助(然后也可以看到malloc在可执行文件的符号表上。

遗憾的是,这不是一个选择,这些库需要保持共享,并且我无法使用LD_PRELOAD技巧


可能是什么问题?我猜想其他一些使用glibc malloc的库早已链接了,但是我不知道该如何处理。我希望前面提到的cmake中的标志会有所帮助,但显然没有帮助。

我花了几天时间在Internet上进行搜索,因为我的makefile /链接器知识有限,无法找到更多信息,我将不胜感激。


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

0 个答案:

没有答案