2011-09-24 9 views
6

Sto lavorando su una macchina virtuale che mi piacerebbe essere in grado di interfacciare con C. Andare dall'altra parte ed esporre le funzioni della macchina virtuale al codice C è abbastanza facile, quello che non riesco a spiegare è C funzioni su una macchina virtuale.Come posso esporre le funzioni C a una macchina virtuale personalizzata?

mi piacerebbe essere in grado di registrare dinamicamente funzioni C con la macchina virtuale in questo modo:

vm_register(printf); 

Poi nella mia macchina virtuale, spingere gli argomenti alla pila, e:

call printf 

Il problema è che senza sapere quanti argomenti richiede la funzione e di quale tipo, non sono sicuro che possano essere usati i puntatori di funzione.

Esiste un tipo di puntatore di funzione generico che può essere utilizzato in questa situazione? Qualcuno può guidarmi nella giusta direzione?

+0

Personalizzato V.M. Idea interessante Esponendo le funzioni, intendi chiamare un D.L.L./Funzione Shared Object/Shared Library o da una libreria "* .h"? – umlcat

risposta

5

La risposta generale è che è necessario implementarlo da soli utilizzando l'assembly. Dopo il collegamento con libc, hai l'indirizzo della funzione che vuoi chiamare, e devi passare i parametri alla funzione manualmente (usando la convenzione di chiamata di qualsiasi piattaforma su cui è in esecuzione la tua macchina virtuale).

Fortunatamente c'è una libreria, libffi, che fa esattamente quello che vuoi. È abbastanza facile da usare, la sua fonte include alcuni documenti ed esempi. Se sei interessato a vedere come funziona, puoi dare un'occhiata al suo codice (ad esempio calling a function using the unix calling convention).

Per quanto riguarda i tipi di parametri, di solito devi lasciare che siano gli utenti a descriverli per te e accettarli ciecamente e trasmetterli ulteriormente a libffi (o all'hardware se lo fai senza libffi). Un altro modo sarebbe quello di analizzare il file di intestazione C per la funzione da chiamare, che è meno incline agli errori - ma in ogni caso, non c'è davvero un modo sicuro in quanto il codice binario per la funzione non descrive la sua interfaccia (con printf e il suo elenco dei parametri variabili ancora di più).

Problemi correlati