2011-09-24 15 views
6

Estoy trabajando en una máquina virtual que me gustaría ser capaz de interactuar con C. En sentido contrario y la exposición de las funciones de la máquina virtual de código C es bastante fácil, lo que no puedo envolver mi cabeza alrededor está exponiendo C funciones a una máquina virtual.¿Cómo puedo exponer las funciones C a una máquina virtual personalizada?

Me gustaría ser capaz de registrar dinámicamente funciones C con la máquina virtual, así:

vm_register(printf); 

Luego, en mi máquina virtual, empujar los argumentos de la pila, y:

call printf 

El problema es que sin saber cuántos argumentos requiere la función, y de qué tipo, no estoy seguro de que se puedan utilizar los punteros de función.

¿Existe una función genérica tipo de puntero que se puede utilizar en esta situación? ¿Alguien puede dirigirme en la dirección correcta?

+0

Personalizado V.M. Idea interesante. Al exponer funciones, te refieres a llamar a D.L.L./Objeto compartido/Función de biblioteca compartida o desde una biblioteca "* .h" – umlcat

Respuesta

5

La respuesta general es que usted tiene que aplicar por sí mismo utilizando el montaje. Después de vincular con libc, tiene la dirección de la función a la que desea llamar y debe pasar los parámetros a la función manualmente (utilizando la convención de llamadas de cualquier plataforma en la que se ejecute su máquina virtual).

suerte hay una biblioteca, libffi, que hace exactamente lo que quiere. También es bastante fácil de usar, su fuente incluye algunos documentos y ejemplos. Si le interesa ver cómo funciona, puede echar un vistazo a su código (por ejemplo, calling a function using the unix calling convention).

En cuanto a los tipos de parámetros, generalmente tiene que dejar que el usuario los describa por usted y aceptarlos ciegamente y pasarlos a libffi (o al hardware si lo hace sin libffi). Otra forma sería analizar el archivo de encabezado C para que llame la función, que es menos propenso a errores, pero en cualquier caso, no hay manera segura ya que el código binario para la función no describe su interfaz (con printf y su lista de parámetros variables aún más).

Cuestiones relacionadas