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

时间:2018-03-15 23:39:01

标签: c malloc clang glibc

我正在尝试在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

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

提前致谢。

3 个答案:

答案 0 :(得分:6)

替换glibc devServer: { hot: true, filename: 'bundle.js', publicPath: '/', historyApiFallback: true, contentBase: ['/', '/public'], proxy: { "*": "http://localhost:3000" } } 实现的推荐方法是ELF符号插入:

这样,您不必重新编译所有内容,包括glibc,并且一旦glibc删除malloc挂钩,您的malloc替换仍会被调用。

malloc方法在没有重新编译(或至少重写)所有内容的情况下无效,因为所有其他库(包括glibc)都将使用非包装符号。

答案 1 :(得分:1)

有一些特殊的"钩子"在glibc(__malloc_hook__realloc_hook__free_hook__memalign_hook)中捕捉所有glibc的malloc:https://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html

  

GNU C Library允许您通过指定适当的钩子函数来修改malloc,realloc和free的行为。例如,您可以使用这些钩子来帮助您调试使用动态内存分配的程序。

挂钩不安全,并在手册页中标记为已弃用。某些变体列在An alternative for the deprecated __malloc_hook functionality of glibc

另外,请检查jemalloctcmalloc等替代malloc如何实现特殊库"预加载/链接特殊库"取代glibc malloc。

答案 2 :(得分:0)

保证匹配malloc / free的唯一方法是重新编译所有内容,包括libc。这对您来说可能不实用,所以最好的选择是以某种方式跟踪malloc包装器分配的内存,然后适当地自行解除分配或在__real_free包装器中调用free关于如何分配内存。