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

时间:2020-03-06 14:35:42  来源:igfitidea点击:

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

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

这可以在任何Unix上完美运行,并且可以在具有大多数功能的Windows上运行,但不适用于malloc。我怎样才能做到这一点?与不允许分配它的malloc有什么不同?

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

解决方案

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

关于这有多难,确实有很好的讨论:

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

显然,我们需要修补CRT

编辑:实际上,一位MS员工在讨论中给出了该技术。我们需要将malloc移至lib,然后在CRT之前将其链接

"他还提到,如果我们将malloc作为CRT之前的lib链接(即,确保打开忽略默认libs并明确包含CRT),我们将获得所需的内容,并且可以毫无问题地重新分配该lib。

从3.0版开始,Firefox使用自定义分配器(AFAIR jmalloc)-我们可以检查它们的执行方式。我读到他们有一些问题。我们可以查看此博客文章。

在项目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); }
...