我正在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.so
与myMalloc.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中的标志会有所帮助,但显然没有帮助。
我花了几天时间在Internet上进行搜索,因为我的makefile /链接器知识有限,无法找到更多信息,我将不胜感激。
编辑:我看不到标记为重复的问题如何回答我的问题。我有一个与共享库有关的特定问题,而重复中甚至没有提到链接。