我想调用我的自定义malloc/new调用,而不是标准库函数。**1.**对于malloc,我有这个短程序
#include <stdio.h>
#include <stdlib.h>
void *__real_malloc(size_t size);
void *__wrap_malloc(size_t size)
{
void *ptr = __real_malloc(size);
printf("malloc(%ld) = %p\n", size, ptr);
return ptr;
}
int main(void) {
int* ptr = (int*) malloc(sizeof(int));
return 0;
}
我使用下面的命令来编译g++ -Wl,--wrap,malloc main.cpp
,但得到下面的错误
/usr/bin/ld: /tmp/ccnB04KY.o: in function `__wrap_malloc(unsigned long)':
b3.cpp:(.text+0x18): undefined reference to `__real_malloc(unsigned long)'
/usr/bin/ld: /tmp/ccnB04KY.o: in function `main':
b3.cpp:(.text+0x54): undefined reference to `__wrap_malloc'
collect2: error: ld returned 1 exit status
这适用于gcc for。c文件,但不与g++和.cpp文件有什么问题
**2.**我也不知道如何覆盖新的呼叫?
4条答案
按热度按时间jljoyd4f1#
为什么
g++
不能和-Wl,--wrap,malloc
兼容?g++
用于C++,C++ ABI与C ABI不同。因此,您需要在__real_malloc
和__wrap_malloc
周围添加extern "C"
:C将名称重写为某种随机(至少看起来是这样)字符串以避免冲突,而C * 经常 * 只是在“C”名称之前插入
_
以在程序集中创建名称。(这种命名约定称为_cdecl
,并且最常用。)extern "C"
强制C编译器根据C的约定生成名称。有关详细信息,请参阅https://en.wikipedia.org/wiki/Name_mangling。如何覆盖
new
?您可以专门为某个类重写
new
,或提供全局new
。参见https://en.cppreference.com/w/cpp/memory/new/operator_new。2uluyalo2#
如果你正在使用glibc,那么你可以使用malloc的GNU扩展:人用马洛克钩
对于
new
,您可以提供全局新。参见https://en.cppreference.com/w/cpp/memory/new/operator_new。ylamdve63#
其他答案说明了为什么
-Wl,--wrap,malloc
不起作用。但是请注意,在你使它工作之后,你的代码很可能由于堆栈溢出而崩溃。
这是因为
printf
可以(并且在某些情况下确实)调用malloc
本身,当这种情况发生时,很可能会出现无限递归。htrmnn0y4#
如果有人想知道如何覆盖所有的分配器函数,Here is a list的所有函数,mimalloc(MIT许可证)从微软覆盖:
这些重写被重定向到mimalloc/src/alloc-override.c中的 mimalloc 库。一些重要的功能是:
因此,为了覆盖所有相关函数,自定义这些条目可能是另一种解决问题的好方法。