c - 为什么 libc 中的内存分配没有路由到我的分配包装器?

标签 c malloc clang glibc

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

相关文章:

python - 在 python bindings/clang 中的 get-includes 中解析 cpp 文件时过滤目录

c++ - 如何使用 Clang 更喜欢一个图书馆位置而不是另一个图书馆位置?

c - 为什么结构不能直接赋值?

c - 8位取模256如何得到校验和?

c - 从单链表的末尾迭代到开头而不反转它

c - 在 C/C++ 中使用 malloc 和 free 并收到错误 HEAP CORRUPTION DETECTED

C 编程 : malloc() inside a function

c - 将 malloc 用于结构的多维数组

objective-c - ReactiveCocoa 的 ClangFormat 样式

c - 用 C 读取和写入 .bin 文件