2012-08-06 14 views
5

¿Es posible cargar una biblioteca desde la memoria en lugar de desde el sistema de archivos en mac/gcc?Cargar biblioteca dinámica desde la memoria

Con Windows estoy usando MemoryModule pero obviamente no es compatible con plataformas cruzadas.

+0

posible duplicado de [¿dlopen from memory?] (Http://stackoverflow.com/questions/5053664/dlopen-from-memory) –

+0

@JonathonReinhart - No del todo. Eso es preguntar cómo 'piratear' 'dlopen' (* específicamente *) para cargar desde la memoria. Me pregunto acerca de cualquier otra forma posible de hacerlo. – Qix

Respuesta

6

Lo primero es lo primero, para hacer esto le aconsejo que utilice leer el OS X ABI Dynamic Loader Reference.

Para hacer esto, debe usar la API NSCreateObjectFileImageFromMemory.

Dado un puntero a un archivo Mach-O en la memoria, esta función crea y devuelve una referencia NSObjectFileImage. La implementación actual solo funciona con paquetes, por lo que debe compilar el archivo ejecutable de Mach-O utilizando la opción del vinculador -bundle.

El bloque de memoria que apunta a address, debe asignarse con vm_allocate (/usr/include/mach/vm_map.h).

Asegúrese de cumplir con el requisito de que vm_allocate se utilice para el bloque de memoria que contiene el módulo.

Una vez que adquiere la imagen del archivo de objeto, debe usar la función NSLinkModule para vincular el módulo al programa.

Cuando llama a esta función, todas las bibliotecas a las que hace referencia el módulo dado se agregan a la lista de búsqueda de la biblioteca. A menos que pase el NSLINKMODULE_OPTION_PRIVATE, NSLinkModule agrega todos los símbolos globales en el módulo a la lista de símbolos global.

Después del enlace, no olvide limpiar llamando a la función NSDestroyObjectFileImage.

Cuando esta función se llama, el cargador dinámico llama vm_deallocate (/usr/include/mach/vm_map.h) en la memoria apuntada por el parámetro objectFileImage.

Tenga en cuenta que, si bien estas funciones están en desuso, no hay sustituto (a lo mejor de mi conocimiento) con la alternativa sugerida dlopen et. Alabama.

Cuestiones relacionadas