有没有一种方法可以在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); } ...