我正在尝试在 CentOS 上提供内存包装器并使用 clang 编译器/链接器。我为分配函数(malloc 等)编写了包装器,并使用 -Wl、-wrap、malloc 重新路由了调用。
一切正常,我可以看到它在运行。
void* 内存 = malloc(10);//路由到 __wrap_malloc
free(mem);//路由到 __wrap_free
但是,我看到的问题是,在 libc 中分配的任何内存都没有被路由到我的包装器,而是应用程序正在进行的免费调用被拦截(并因此崩溃)。例如,
char* newStr = strdup("foo");//libc 内部的 malloc 并没有来 wrapper
免费的(新的);//自由调用到达包装器
我的程序是用 C++ 编写的。我创建了一个 mallocimpl.cpp 并做了类似的事情
外部“C”{
void* __wrap_malloc(size_t 大小)
{
//通过自定义内存分配器路由内存
}
//类似地,__wrap_calloc、__wrap_realloc、__wrap_memalign和__wrap_free
知道我做错了什么吗?我需要任何特殊的编译器/链接器标志吗?
提前致谢。
最佳答案
替换 glibc malloc
实现的推荐方法是 ELF 符号插入:
这样,您不必重新编译所有内容,包括 glibc,并且一旦 glibc 删除了 malloc
Hook ,您的 malloc
替换仍将被调用。
如果不重新编译(或至少重写)所有内容,__wrap
方法将无法工作,因为所有其他库(包括 glibc)将使用非包装符号。
关于c - 为什么 libc 中的内存分配没有路由到我的分配包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49311018/