Как я могу предоставить функции C пользовательской виртуальной машине? - PullRequest
6 голосов
/ 24 сентября 2011

Я работаю на виртуальной машине, с которой я бы хотел иметь возможность взаимодействовать с C. Переходить в другую сторону и показывать функции виртуальной машины в C-коде довольно легко, я не могу обойтись без разоблачения. Функции C для виртуальной машины.

Я бы хотел иметь возможность динамически регистрировать функции C на виртуальной машине следующим образом:

vm_register(printf);

Затем в моей виртуальной машине поместите аргументы в стек и:

call printf

Проблема в том, что, не зная, сколько аргументов требуется функции и какого типа, я не уверен, что указатели на функции можно использовать.

Существует ли типовой указатель на функцию, который можно использовать в этой ситуации? Может ли кто-нибудь направить меня в правильном направлении?

1 Ответ

5 голосов
/ 24 сентября 2011

Общий ответ заключается в том, что вы должны реализовать это самостоятельно, используя сборку. После соединения с libc у вас есть адрес функции, которую вы хотите вызвать, и вам нужно передать параметры в функцию вручную (используя соглашение о вызовах для любой платформы, на которой работает ваша виртуальная машина).

К счастью, есть библиотека, libffi , которая делает именно то, что вы хотите. Он также довольно прост в использовании, его источник включает некоторую документацию и примеры. Если вам интересно посмотреть, как это работает, вы можете взглянуть на его код (например, , вызывающий функцию с использованием соглашения о вызовах Unix ).

Что касается типов параметров, вы обычно должны позволить пользователю описать их для вас, принять их вслепую и передать их дальше libffi (или аппаратному обеспечению, если вы делаете это без libffi). Другим способом было бы проанализировать заголовочный файл C для вызываемой функции, который менее подвержен ошибкам - но в любом случае, действительно нет безопасного пути, поскольку двоичный код функции не описывает ее интерфейс (с printf и его список переменных параметров тем более).

...