为什么libc中的内存分配不会路由到我的分配包装器?

mas*_*rs3 6 c malloc glibc clang

我试图在CentOS上提供内存包装并使用clang编译器/链接器.我为分配函数(malloc等)编写了包装器,并使用-Wl,-wrap,malloc重新路由调用.

这一切都很好,我可以看到它在行动. void* mem = malloc(10); // routes to __wrap_malloc free(mem);// routes to __wrap_free

但是,我看到的问题是,在libc中分配的任何内存都没有被路由到我的包装器,但是应用程序正在进行被拦截的免费调用(并因此崩溃).例如,

char* newStr = strdup("foo"); // The internal malloc in libcdoes not come to wrapper free(newStr); // The free call makes it to the wrapper

我的程序是用C++编写的.我创建了一个mallocimpl.cpp并做了类似的事情

extern "C"{ void* __wrap_malloc(size_t size) { // Route memory via custom memory allocator } //Similarly, __wrap_calloc, __wrap_realloc, __wrap_memalign and __wrap_free

我有什么想法我做错了吗?我需要任何特殊的编译器/链接器标志吗?

提前致谢.

Flo*_*mer 6

替换glibc malloc实现的推荐方法是ELF符号插入:

这样,您不必重新编译所有内容,包括glibc,malloc一旦glibc删除了malloc钩子,您的替换仍然会被调用.

如果__wrap不重新编译(或至少重写)所有内容,该方法将无法工作,因为所有其他库(包括glibc)将使用非包装符号.