2008-09-23 14 views
9

Me gustaría reemplazar el malloc predeterminado en tiempo de enlace para usar un malloc personalizado. Pero cuando intento de redefinir malloc en mi programa, me sale este error:¿Hay alguna manera de redefinir malloc en tiempo de enlace en Windows?

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

Esta aplicación funciona perfectamente en cualquier Unix, y funciona en Windows con la mayoría de las funciones, pero no con malloc. ¿Cómo puedo hacer esto? ¿Y qué es diferente con malloc que no permite anularlo?

Sé que podría reemplazar todas las llamadas a malloc con mi malloc personalizado, o usar una macro para hacerlo, pero preferiría no modificar todas las bibliotecas de terceros.

Respuesta

15

Hay muy buena discusión de lo difícil que es aquí:

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

Al parecer, tienes que parchear el CRT

Editar: en realidad, un empleado de MS dio la técnica en La discusión. Es necesario mover su malloc a un lib, y luego vincularlo antes de la CRT

"También menciona que si se vincula su malloc como lib antes el CRT (es decir, asegúrese de activar el 'caso omiso de librerías por defecto 'e incluir explícitamente el CRT), obtendrá lo que desea, y puede redistribuir esta lib sin problemas.

+0

En la misma discusión se menciona que el enfoque "lib antes del crt" no funciona de manera confiable con funciones como (strdup) – Weidenrinde

+0

qué pasa con '_CrtSetAllocHook': https://msdn.microsoft.com/en-us/library/ cy8c7wz5.aspx – dashesy

2

Creo que depende en qué orden se vinculan los archivos. Creo que primero debe vincular su función personalizada y luego la biblioteca de importación.

+0

Esto es correcto - que necesita para mover el malloc a un lib primer lugar, encienda "ignorar librerías por defecto", y luego enlazar con el CRT de forma explícita. –

1

A partir de la versión 3.0, Firefox usa un asignador personalizado (AFAIR jmalloc): puede comprobar cómo lo hicieron. Leí que tenían algunos problemas con eso. Puede verificar esto blog post.

1

¿Qué pasa con la definición de malloc = _custom_malloc en el archivo make del proyecto? que la adición de un archivo, tales como:

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

No funcionará en las bibliotecas No tengo la fuente. – Jazz

Cuestiones relacionadas