2012-01-26 11 views
5

Duplicar posibles:
dlopen from memory?Cargando .so archivos de la memoria

que he visto esto para los archivos DLL de Windows, que se carga desde un búfer de memoria, pero no lo encuentro en cualquier lugar para Linux, y el código fuente "ld" es el código más complejo que he visto. Entonces:

¿Hay algún ejemplo de carga de archivos .so desde la memoria? ¿Incluso uno simple que puedo terminar? Simplemente no sé por dónde empezar, aunque he leído la mayoría de las especificaciones ELF, todavía es misterioso para mí.

+0

.so se envía a través de una conexión de socket, y estoy buscando una solución de compañero, no una alternativa. – killercode

+0

@killercode está buscando una solución a un problema que ha definido de forma bastante estricta. Actualmente no tiene el conocimiento para codificar .so de la memoria y quiere pagarle a alguien para que lo haga. Las alternativas tienen más sentido, a menos que nos pueda dar algún contexto. –

+0

.so se envía por sockets, no quiero escribirlo en el disco ya que mi aplicación puede no tener el privilegio de escribir archivos en el disco, por lo que quiero ejecutarlo desde la memoria para evitar cualquiera de esos en cualquier plataforma y no solo linux. – killercode

Respuesta

8

Está buscando el código fuente de una cosa incorrecta: ld no carga el programa ni la biblioteca. En su lugar, debe consultar el código fuente de las funciones dlopen y dlsym que se encuentran en libc. Además, debe consultar la fuente del enlazador dinámico vinculador: ld-linux.so (el nombre verdadero varía según la plataforma; ejecute ldd /bin/ls para averiguar dónde reside el vinculador dinámico).

El análisis ELF no es difícil, pero requiere atención a los detalles y la comprensión del código de ensamblaje para la CPU en particular; necesita también la especificación de ABI para su plataforma (y es diferente para Linux de 32 y 64 bits, y también es diferente entre las CPU.)

Si sólo tiene que cargar ficheros objeto de la memoria en tiempo de ejecución (es decir, no tiene que ser un SO), puede ver el proyecto X11: han implementado un sistema de módulo que, básicamente, carga el código objeto en alguna dirección y lo reubica.

+0

También vea 'readelf'. – cha0site

-1

Necesita la familia de funciones dlopen() (en GNU/Linux, se definen en /usr/include/dlfcn.h).

Por ejemplo, eche un vistazo a how PHP does modules.

+0

Sé cómo usar .so desde el disco, quiero usarlos de memoria, no existen en el disco – killercode

0

¿Qué significa "carga de .so archivos de la memoria" para usted?

Si tiene *.soarchivo, entonces está en algún sistema de archivos, y tiene una ruta de acceso. Entonces solo usa dlopen en él.

Si no es un archivo , ¿qué es? ¿Cómo te metiste en la memoria? ¿Qué tienes exactamente en la memoria? (¿Tiene un encabezado ELF y diseño ELF en memoria?)

Si tiene suficiente información para crear un archivo ELF *.so, vacíe (es decir, escriba) dicho archivo en algún sistema de archivos (utilice un sistema de archivos temporal como tmpfs si están preocupados con el rendimiento del disco). Entonces dlopen eso.

Si no tiene suficiente información para hacer un archivo ELF .so, entonces probablemente esté generando código dinámicamente en la memoria. Mire qué infraestructura de generación de código de máquina existente (como LLVM, GCCJIT, libjit, GNU lightning, LuaJit ....) están haciendo.

Si usted tiene un código funcional completa en la memoria, asegúrese de que la memoria es ejecutable con mmap & mprotect y saltar en él (por ejemplo,usando trucos de puntero de función).

+0

Estoy bastante sorprendido por los comentarios negativos. ¿Qué dije mal? ¿Por qué mi respuesta no es relevante? –

+0

No responde exactamente lo que parece intentar (obstinadamente) lograr de la manera que él quiere, pero esta información generalmente es útil. +1 –

+0

No entiendo exactamente qué significa el cartel original al "cargar un archivo' .so' de la memoria "... (o incluso cargar cualquier tipo de archivo de la memoria), ya que un archivo solo se puede leer desde un sistema de archivos. Supongo que Windows tenía esa función porque (IIRC) en Windows varios procesos no pueden operar en un archivo a la vez (por ejemplo, no se puede eliminar un archivo que se abre por otro proceso en Windows, pero se puede hacer eso en Linux) . –