2011-09-24 9 views
6

Pracuję na maszynie wirtualnej, którą chciałbym móc połączyć z C. Przejście w drugą stronę i eksponowanie funkcji maszyny wirtualnej na kod C jest dość łatwe, co nie jest w stanie objąć mojej głowy, naraża C funkcje do maszyny wirtualnej.Jak mogę wyświetlić funkcje C na niestandardowej maszynie wirtualnej?

Chciałbym móc dynamicznie zarejestrować funkcji C z maszyną wirtualną tak:

vm_register(printf); 

Wtedy w mojej wirtualnej maszynie, wciśnij argumenty na stos, a także:

call printf 

Problem polega na tym, że nie wiedząc, ile argumentów wymaga funkcja i jakiego typu, nie jestem pewien, czy można użyć wskaźników funkcji.

Czy istnieje typowy typ wskaźnika, którego można użyć w tej sytuacji? Czy ktoś może mnie skierować we właściwym kierunku?

+0

Własne V.M. Ciekawy pomysł. Przez eksponowanie funkcji masz na myśli wywołanie D.L.L./Shared Object/Shared Library lub z biblioteki "* .h"? – umlcat

Odpowiedz

5

Ogólna odpowiedź jest taka, że ​​należy ją zaimplementować samodzielnie za pomocą zespołu. Po połączeniu z libc masz adres funkcji, którą chcesz wywołać, i musisz przekazać parametry do funkcji ręcznie (przy użyciu konwencji wywoływania dowolnej platformy, na której uruchomiona jest twoja maszyna wirtualna).

Na szczęście jest biblioteka, libffi, która robi dokładnie to, co chcesz. Jest również łatwy w użyciu, jego źródło zawiera pewną dokumentację i przykłady. Jeśli chcesz zobaczyć, jak to działa, możesz rzucić okiem na jego kod (np. calling a function using the unix calling convention).

Jeśli chodzi o typy parametrów, zwykle musisz pozwolić, aby użytkownik opisał je dla ciebie i na ślepo to zaakceptował i przekazał dalej do libffi (lub do sprzętu, jeśli zrobisz to bez libffi). Innym sposobem byłoby przeanalizowanie pliku nagłówkowego C dla wywoływanej funkcji, co jest mniej podatne na błędy - ale w żadnym wypadku nie ma bezpiecznej drogi, ponieważ kod binarny funkcji nie opisuje jej interfejsu (z printf i jego lista zmiennych parametrów jeszcze bardziej).

Powiązane problemy