Парсинг версии PE-заголовков для Unix / iPhone / Mac OS X - PullRequest
0 голосов
/ 04 ноября 2008

Это немного запутанно, но давайте попробуем:

Я интегрирую скрипты LUA в свой игровой движок, и в прошлом я делал это на win32 элегантным способом. На win32 все, что я делал, было помечать все функции, которые я хотел представить LUA, как функции экспорта. Затем, чтобы интегрировать их в LUA, я бы проанализировал PE-заголовок исполняемого файла, разобрал имена, проанализировал параметры и тому подобное, а затем зарегистрировал их в моей среде выполнения LUA. Это позволило мне избежать ручной регистрации каждой функции по отдельности, просто чтобы выставить их LUA.

Теперь вернемся к сегодняшнему дню, когда я работаю над iPhone. Я просмотрел кое-что из Unix и подошел очень близко к подобному подходу, однако я не уверен, что он действительно сработает.

Я не совсем знаком с Unix, но вот что у меня есть на iPhone:

Вышеуказанные шаги не приведут меня туда, где я хочу быть, но даже это не сработает. У кого-нибудь есть опыт работы с подобными вещами в Unix? Есть ли какие-нибудь заголовки или функции, которые я могу использовать в Google, чтобы поставить меня на правильный путь?

Спасибо;)

Ответы [ 4 ]

3 голосов
/ 04 ноября 2008

iPhone не поддерживает динамическое связывание после запуска первоначального приложения. Хотя то, что вы хотите сделать, на самом деле не требует связывания в каком-либо новом приложении TEXT, меня не шокирует обнаружение того, что некоторые функции dl * не работают должным образом.

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

Я знаю, что люди установили и запустили этот материал на Windows и Linux, я использовал его на Mac OS X и различных * BSD. Я связываю реализацию FreeBSD linker_set, но лично я не видел реализацию Windows.

0 голосов
/ 05 ноября 2008

Вы можете просто сгенерировать файл карты и использовать его вместо этого, нет?

0 голосов
/ 04 ноября 2008

Если статическое связывание является опцией, интегрируйте это в скрипт компоновщика. Перед связыванием сделайте «nm» для всех объектных файлов, извлеките глобальные символы и сгенерируйте файл C, содержащий (предпочтительно отсортированный / хешированный) отображение всех имен символов на значения символов:

  struct symbol{ char*  name; void * value } symbols = [
     {"foo", foo},
     {"bar", bar},
     ...
     {0,0}};

Если вы хотите быть избирательным в том, что вы выставляете, может быть проще всего реализовать схему именования, например, Префикс всех функций / методов с помощью Lua _.

Кроме того, вы можете создать тривиальный макрос,

   #define ForLua(X) X

и затем найдите источники для ForLua, чтобы выбрать символы, которые вы хотите включить.

0 голосов
/ 04 ноября 2008

Вам необходимо передать --export-dynamic компоновщику (через -Wl,--export-dynamic).

Примечание. Это для Linux, но может стать отправной точкой для поиска.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...