有没有一种方法在Windows上重新定义链接时的malloc函数?

10
我想在链接时用自定义的malloc替换默认的malloc。但是当我试图在我的程序中重新定义malloc时,我会收到以下错误消息:

MSVCRT.lib(MSVCR80.dll) : error LNK2005: _malloc already defined in test.lib(test.obj)

这在任何Unix上都可以完美运行,在Windows上大多数函数也可以,但与malloc不兼容。我该怎么做?并且,是什么使得无法覆盖malloc?

我知道我可以用自定义的malloc替换每个调用,或使用宏来实现此目的,但我不想修改每个第三方库。

4个回答

16

这里有一个非常好的讨论,说明了这有多难:

http://benjamin.smedbergs.us/blog/2008-01-10/patching-the-windows-crt/

显然,你需要修补CRT

编辑:实际上,在该讨论中,一位微软员工提供了技术方法。您需要将您的malloc移动到一个库文件中,然后在CRT之前链接它。

“他还提到,如果你将malloc作为库文件 CRT之前链接(即确保打开“忽略默认库”,并明确包含CRT),你将得到想要的结果,并且可以重新分发此库文件而不会出现问题。”


1
在同一讨论中提到,“库优先于crt”方法在像(strdup)这样的函数中不可靠。 - Weidenrinde
1
_CrtSetAllocHook是什么:https://msdn.microsoft.com/zh-cn/library/cy8c7wz5.aspx - dashesy

2

我认为这取决于你链接文件的顺序。我认为你需要先链接你的自定义函数,然后再链接导入库。


这是正确的--他需要先将malloc移到一个库中,打开“忽略默认库”,然后显式链接到CRT。 - Lou Franco

1

从3.0版本开始,Firefox使用自定义分配器(我想是jmalloc)- 您可以检查他们是如何实现的。我读到他们在使用过程中遇到了一些问题。您可以查看这个博客帖子


1

关于在项目 makefile 中定义 malloc=_custom_malloc ,再添加一个文件呢?

my_memory.c
#undef malloc
#undef calloc
...
void *_custom_malloc(int size) { return jmalloc(size); }
void *_custom_calloc(int size) { return jcalloc(size); }
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接