2009-11-23 17 views
12

Tengo que hacer algo bastante inusual: ejecutar manualmente un ejecutable elf. Es decir. cargue todas las secciones en los lugares correctos, busque main() y llámelo (y luego limpieza). El ejecutable se vinculará estáticamente, por lo que no será necesario vincular las bibliotecas. También controlo la dirección base, por lo que no me preocupan los posibles conflictos.Linux user-space ELF loader

Entonces, ¿hay alguna biblioteca para eso?

He encontrado OSKit y su liboskit_exec, pero el proyecto parece estar muerto desde 2002.

estoy bien con la toma de partes de proyectos (respetando licencias, por supuesto) y adaptándolos a mi necesidad, pero como yo Soy bastante novato en el mundo de Linux, ¡ni siquiera sé dónde encontrar esas partes! :)

PS. Lo necesito para la plataforma ARM.

UPD Bueno, la cuestión de cargar elfs parece requerir un buen conocimiento al respecto (suspiro), así que estoy fuera para leer algunas especificaciones y manuales. Y creo que me quedaré con bionic/linker y libelfsh. ¡Gracias chicos!

resultados resumidos:

+0

* bump * Tengo exactamente este mismo problema (también en ARM), sin embargo, también tengo que hacer la reubicación. –

Respuesta

2

Una rápida apt-cache search sugiere libelf1, libelfg0 y/o libelfsh0. Creo que el programa elfsh (en el paquete del mismo nombre) podría ser un ejemplo práctico interesante de cómo usar libelfsh0.

No he probado ninguno, pero espero que puedan ser útiles. Buena suerte :-)

0

Eche un vistazo a libelf para leer el formato ejecutable. Tendrás problemas con esto, creo.

Parece que, como no necesita bibliotecas para nada, ¿por qué no simplemente mmap su ejecutable, establecer datos sobre varias áreas de memoria y jmp/b?

No sé si ARM tiene un equivalente de NX-bit, pero vale la pena comprobarlo.

1

El Android de Google, en su implementación libc "biónica", tiene un cargador ELF completamente reimplementado. Es razonablemente limpio, y probablemente una mejor fuente que gilbc si estás buscando algo simple.

0

Esta herramienta contiene un cargador ELF: http://bitwagon.com/rtldi/rtldi.html

que reutiliza el código de rtldi para una chainloader ELF en otro proyecto.El código está aquí: http://svn.gna.org/viewcvs/plash/trunk/chroot-jail/elf-chainloader/?rev=877 y hay algunos antecedentes aquí: http://plash.beasts.org/wiki/Story16. (Aparentemente tengo que romper estos enlaces porque stackoverflow no me deja publicar> 1 enlace!)

Cuestiones relacionadas