有没有办法在Windows上的链接时重新定义malloc?

时间:2008-09-23 12:22:51

标签: c windows

我想在链接时替换默认的malloc以使用自定义malloc。但是当我尝试在程序中重新定义malloc时,我收到了这个错误:

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

这适用于任何Unix,它适用于具有大多数功能的Windows,但不适用于malloc。我怎样才能做到这一点?与malloc不同的是,不允许覆盖它?

我知道我可以用我的自定义malloc替换每次对malloc的调用,或者使用宏来执行此操作,但我宁愿不修改每个第三方库。

4 个答案:

答案 0 :(得分:16)

关于这有多困难,我们真的很好讨论:

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

显然,您需要修补CRT

编辑:实际上,一名MS员工在讨论中提供了这项技术。您需要将malloc移动到lib,然后在CRT之前将其链接

“他还提到如果你在 CRT之前将你的malloc链接为lib (即确保打开'忽略默认库'并且明确地包含CRT),你会得到什么你想要的,并且可以毫无问题地重新发布这个库。“

答案 1 :(得分:2)

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

答案 2 :(得分:1)

从版本3.0开始,Firefox使用自定义分配器(AFAIR jmalloc) - 您可以检查它们是如何做到的。我读到他们遇到了一些问题。您可以查看此blog post

答案 3 :(得分: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); }
...