tags:

views:

1008

answers:

3

I would like to replace the default malloc at link time to use a custom malloc. But when I try to redefine malloc in my program, I get this error:

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

This works perfectly on any Unix, and it works on Windows with most functions, but not with malloc. How can I do this? And what is different with malloc that disallow overriding it?

I know I could replace every call to malloc with my custom malloc, or use a macro to do this, but I would rather not modify every third party library.

+2  A: 

I think it depends in which order you link the files. I think you need to link your custom function first, then the import library.

dguaraglia
This is correct -- he needs to move the malloc to a lib first, turn on "ignore default libs", and then link to the CRT explicitly.
Lou Franco
+11  A: 

There is really good discussion of how hard this is here:

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

Apparently, you need to patch the CRT

Edit: actually, a MS employee gave the technique in the discussion. You need to move your malloc to a lib, and then link it before the CRT

"he also mentions that if you link your malloc as a lib before the CRT (i.e. make sure to turn on ‘ignore default libs’ and explictly include the CRT), you’ll get what you want, and can redistribute this lib without problems."

Lou Franco
In the same discussion it is mentioned that the "lib before the crt" approach does not reliably work with functions like (strdup)
Weidenrinde
+1  A: 

From version 3.0 Firefox uses a custom allocator (AFAIR jmalloc) -- you could check how they did it. I read that they had some problems with it. You may check this blog post.

Kasprzol