2011-07-07 24 views
11

Necesito llamar a una función de otro programa. Si el otro programa fuera una biblioteca, simplemente podría usar dlopen y dlsym para obtener un control de la función. Desafortunadamente, el otro programa es un ejecutable de Unix, y construirlo como una biblioteca no es una opción. Tratando dlopen() en el ejecutable da este mensaje de error:Usando dlopen() en un archivo ejecutable

dlopen([...]/testprogram, 1): no suitable image found. Did find: [...]/testprogram: can't map

Esto no es sorprendente, ya que dlopen está destinado para su uso con las bibliotecas, no ejecutables. ¿Hay alguna manera de hacer que dlopen y dlsym trabajen con ejecutables? Si no, ¿hay una forma alternativa de lograr lo mismo?

Respuesta

7

No puede abrir ejecutables como bibliotecas. El punto de entrada de un ejecutable intentará reiniciar la biblioteca C y tomar el puntero brk. Esto corromperá tu montón de malloc. Además, es probable que el ejecutable se mapee en una dirección fija sin reubicaciones, y si esta dirección se superpone con algo ya cargado, tampoco es posible mapearla por ese motivo.

Necesita refactorizar el otro programa en una biblioteca o agregar una interfaz RPC al otro programa.

Tenga en cuenta que esto no se aplica necesariamente a los ejecutables de PIE. Sin embargo, a menos que el ejecutable esté específicamente diseñado para ser dlopen() ed, esto no es seguro, ya que main() no se ejecutará y, por lo tanto, no se realizará ninguna inicialización en main().

+3

Como se discutió aquí: http://stackoverflow.com/questions/6617099/call-function-in-unrelated-executable-linux/6619977#6619977, esta respuesta es incorrecta para los ejecutables de PIE, que son realmente una forma especial de bibliotecas compartidas (e incluso tienen ET_DYN e_type). –

6

En algunos sistemas ELF (especialmente Linux), puede dlopen() PIE ejecutables. Cuando se utiliza GCC, simplemente compilar el ejecutable con -fpie o -fPIE, y vincularlo con -pie, y exportar los símbolos apropiados usando --dynamic-list o -rdynamic (que se explica con más detalle en this other SO answer.

+0

A [respuesta similar] (http://stackoverflow.com/questions/19713517/how-to-self-dlopen-an-executable-binary/19716028#19716028). –

0

Para añadir la capacidad de cargar ejecutables a través de dlopen es registrado como RFE rechazado glibc (solicitud de mejora). Se puede encontrar una vista detallada de la RFE y un posible enfoque para algunos casos especiales en

[http://sourceware.org/bugzilla/show_bug.cgi?id= 11754] [1]

Excluyendo PIEs habría muchos problemas detrás de las escenas para implementar tal funcionalidad.

0

Herramienta aquí para hacer precisamente eso, maneja ASLR/PIE y no ASLR/PIE. Compila en x86, ARM y MIPS (solo 32 bits). Edite el archivo Makefile para configurar ARCH param.

http://rtfc.org.uk/cliapi.html

Es mi herramienta, sino que parece hacer lo que quiera. Avíseme si no funciona para usted.

Agradezco lo tarde que estoy en esta fiesta, pero bueno.

Cuestiones relacionadas