2008-09-23 4 views
9

Ich möchte das Standard-malloc zur Verbindungszeit ersetzen, um ein benutzerdefiniertes malloc zu verwenden. Aber wenn ich versuche malloc in meinem Programm neu zu definieren, bekomme ich diesen Fehler:Gibt es eine Möglichkeit, malloc bei Link-Zeit unter Windows neu zu definieren?

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

Das funktioniert perfekt auf jedem Unix, und es funktioniert unter Windows mit dem meisten Funktionen, aber nicht mit malloc. Wie kann ich das machen? Und was ist anders mit malloc, die das Überschreiben verbieten?

Ich weiß, ich könnte jeden Aufruf von malloc mit meinem benutzerdefinierten malloc ersetzen, oder verwenden Sie ein Makro, um dies zu tun, aber ich möchte lieber nicht jede Third-Party-Bibliothek ändern.

Antwort

15

Es gibt wirklich gute Diskussion darüber, wie schwer das hier ist:

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

Offenbar müssen Sie

Bearbeiten, um die CRT-Patch: tatsächlich, ein MS Mitarbeiter die Technik gab in die Diskussion. Sie benötigen eine malloc zu einem lib zu bewegen, und es dann verknüpfen vor dem CRT

„er erwähnt auch, dass, wenn Sie Ihre malloc als lib verlinken vor die CRT (dh sicherstellen, dass auf‚ignore Standard Libs drehen "und beinhalten explizit das CRT), Sie bekommen, was Sie wollen, und können diese Bibliothek ohne Probleme neu verteilen."

+0

In der gleichen Diskussion wird erwähnt, dass die "Lib vor dem CRT" -Ansatz nicht zuverlässig funktioniert mit Funktionen wie (strdup) – Weidenrinde

+0

was ist '_CrtSetAllocHook': https://msdn.microsoft.com/en-us/library/ cy8c7wz5.aspx – dashesy

2

Ich denke, es hängt davon ab, in welcher Reihenfolge Sie die Dateien verknüpfen. Ich denke, dass Sie zuerst Ihre benutzerdefinierte Funktion und dann die Importbibliothek verknüpfen müssen.

+0

Das ist richtig - er braucht die malloc auf eine lib zu bewegen explizit zuerst einschalten „ignorieren Standard Libs“, und dann eine Verknüpfung zu der CRT. –

1

Ab Version 3.0 Firefox verwendet einen benutzerdefinierten Zuordner (AFAIR jmalloc) - Sie können überprüfen, wie sie es getan haben. Ich habe gelesen, dass sie einige Probleme damit hatten. Sie können dies überprüfen blog post.

1

Was ist mit der Definition von malloc = _custom_malloc im Projekt Makefile. als das Hinzufügen einer Datei wie:

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

Es wird nicht auf Bibliotheken funktionieren Ich habe nicht die Quelle. – Jazz

Verwandte Themen