我正在尝试在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
任何想法我做错了什么?我需要任何特殊的编译器/链接器标志吗?
提前致谢。
答案 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
另外,请检查jemalloc
,tcmalloc
等替代malloc如何实现特殊库"预加载/链接特殊库"取代glibc malloc。
答案 2 :(得分:0)
保证匹配malloc
/ free
的唯一方法是重新编译所有内容,包括libc。这对您来说可能不实用,所以最好的选择是以某种方式跟踪malloc
包装器分配的内存,然后适当地自行解除分配或在__real_free
包装器中调用free
关于如何分配内存。