c++ - 通过共享库替换 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.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 中的标志会有所帮助,但显然它们没有。
我花了几天时间在互联网上挖掘这个,因为我的 makefile/链接器知识有些有限,找不到更多信息,我会很感激任何建议。
编辑:我看不到标记的重复问题如何回答我的问题。我有一个与共享库相关的特定问题,而重复中甚至没有提到链接。
解决方案
推荐阅读
- android - 为什么 Kotlin 的 Fragment 中的“活动”链接到“getActivity()”?
- javascript - jQuery dblclick() 事件和 Html ondblclick() 事件的区别
- git - gitlab runner 特定的runner vs Shared runner vs Group runner
- delphi - Delphi FireDAC Firebird 以编程方式获取执行计划
- c# - 使用 EF Core 查询数据库时,有没有办法有条件地包含或排除导航属性
- node.js - Stripe - 无权访问帐户“{{XX}}”(或该帐户不存在)
- php - 如何在不替换现有链接中的单词的情况下替换关联数组中的匹配单词
- c++ - powershell调用具有结构类型参数的c ++ dll的导出函数
- android - 导航组件:parcelable 参数但出现错误类型不匹配:推断类型为 Student 但应为 String
- javascript - 脚本未在 chrome 扩展中加载