He escrito una biblioteca personalizada que implementa malloc/calloc/realloc/free utilizando los prototipos C estándar, y descubrí cómo compilarlo en un archivo así. Quiero probar la biblioteca al vincular una aplicación estándar contra ella? ¿Cuál sería una buena manera de hacer esto? Una vez que tengo una biblioteca en funcionamiento, supongo que puedo cargarla con LD_PRELOAD, pero ¿cómo hago para que mis funciones coexistan pero tienen prioridad sobre las de la biblioteca del sistema? Mis funciones necesitan hacer una llamada a malloc para que la memoria se ejecute, por lo que no puedo eliminar completamente stdlib ... ¿Ayuda?Compilación de un Malloc personalizado
Respuesta
Las funciones que intenta reemplazar son funciones C estándar, no macros, no llamadas al sistema. Por lo tanto, simplemente debe asignarle a sus funciones los mismos nombres y compilarlos en una biblioteca compartida.
Luego, use LD_PRELOAD
para precargar su biblioteca antes de que comience el binario. Como todas las direcciones se resuelven una vez, el vinculador averiguará las direcciones de sus funciones y recordará sus nombres y no las buscará en la biblioteca estándar más adelante.
Este enfoque puede no funcionar si su programa está vinculado de forma estática con el tiempo de ejecución estándar. Además, no funcionará en Mac OS X ya que hay otra API para interpolación.
En Linux, por ejemplo, a fin de que sus funciones de co-existir (es decir, si quieres sistema malloc
utilizar en su propia implementación de malloc
), usted tiene que abrir la biblioteca estándar de forma manual utilizando dlopen
, ver las funciones necesita allí usando dlsym
y los llama más tarde por dirección.
Pensé que me encontraría con más problemas pero después de eliminar la inclusión de la biblioteca estándar y cargar malloc y salir con dlsym todo compilado bien. ¡Gracias! – conartist6
@ conartist6: De nada :) –
Si tiene control del código fuente que va a utilizar esta biblioteca, aquí hay una posibilidad. Use diferentes nombres de funciones: en lugar de malloc, por ejemplo, llámelo newCoolMalloc. Este método a veces es más simple y no depende de las opciones especiales del vinculador.
Luego en su código, use #define
para hacer que el código llame al conjunto de funciones deseado. Puedes #define malloc para ser algo diferente. Por ejemplo:
#define malloc newCoolMalloc
#define free newCoolFree
Si hace eso, sin embargo, debe tener mucho cuidado de incluirlo constantemente. De lo contrario, corre el riesgo de utilizar stdlib malloc en un lugar y luego su propio libre en otro que conduce a errores desordenados. Una forma de ayudar a mitigar esa situación es (si es posible) en su propio código usar nombres personalizados para la asignación y funciones gratuitas. Entonces es más fácil asegurarse de que se está llamando al correcto. Puede definir los diversos nombres personalizados para sus propias funciones malloc o incluso las funciones stdlib malloc originales.
Por ejemplo, es posible utilizar mallocPlaceHolder como su nombre real en el código:
someThing = mallocPlaceHolder(nbytes);
A continuación, sus define verían de la misma familia:
#define mallocPlaceHolder myCoolMalloc
Si no hay función de la forma mallocPlaceHolder (y libre asociado) realmente existen, evita mezclar diferentes bibliotecas.
Lamentablemente, esto no funciona para mí. Quiero probar mi asignador ejecutando la aplicación de otra persona usando esta biblioteca.Podría recompilar con esos incluye en teoría, pero el tiempo y el esfuerzo se guardarán con LD_PRELOAD. – conartist6
No escriba su malloc()
en términos de malloc()
- escríbalo usando sbrk
, que obtiene memoria directamente del sistema operativo.
sugerencia interesante. Lo miraré. – conartist6
En algunos sistemas, 'sbrk()' ya no está disponible. Por ejemplo, en mi Mac OS X actual, el hombre dice 'Las funciones brk y sbrk son curiosidades históricas que quedaron de días anteriores a la llegada de la administración de memoria virtual . Y si se ve el origen completo de la función, es par más divertido: 'errno = ENOMEM; return ((void *) - 1); ' – achedeuzot
- 1. Diseño personalizado de encabezado de implementación malloc()
- 2. ¿Malloc personalizado para muchos bloques pequeños de tamaño fijo?
- 3. Agregando un paso de compilación personalizado con un paquete nuget
- 4. C - Devolver un puntero char sin malloc
- 5. malloc implementation?
- 6. Rendimiento de Malloc en un entorno multiproceso
- 7. Xcode 4 paso de compilación personalizado antes de compilar
- 8. Compilación de SQLite personalizado para una aplicación de iPhone
- 9. ¿Cómo entiende malloc la alineación?
- 10. comportamiento de malloc (0)
- 11. ¿Cuál es la diferencia entre un paso de compilación personalizado y un evento de postconstrucción?
- 12. ¿Cómo funciona malloc en un entorno multiproceso?
- 13. Cómo liberar() un malloc() 'd estructurado correctamente?
- 14. Esquemas de asignación de Malloc
- 15. ¿Es necesario un malloc() antes de un realloc()?
- 16. Usando Malloc Hooks
- 17. malloc en kernel
- 18. Malloc en C++ constructor
- 19. Guardia Malloc no funciona
- 20. Pruebas unitarias para malloc()
- 21. ¿Cómo malloc char ** tabla?
- 22. ARC & Malloc: EXEC_BAD_ACCESS
- 23. ¿Cómo funciona malloc?
- 24. cero tamaño malloc
- 25. Envasado malloc - C
- 26. Malloc en constructores
- 27. Eclipse-CDT: ¿Cuál es la mejor manera de agregar un paso de compilación personalizado?
- 28. Cómo imprimir un mensaje personalizado en el código para el registro de compilación de Teamcity C#
- 29. ¿Cómo puedo omitir temporalmente la ejecución de la tarea de compilación en un comando sbt personalizado?
- 30. ¿Configura el compilador de mensajes (mc.exe) como un paso de compilación personalizado en VC++ 2010?
Estoy bastante seguro de que mi respuesta se basa en el uso del enlazador dinámico. – conartist6