Разбор версии PE заголовков для Unix / iPhone / Mac OS X

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

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

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

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

    Шаг 1: запросить путь к исполняемому файлу через цель-C и получить путь к моему приложению
    Шаг 2. Используйте dlopen, чтобы получить дескриптор моего приложения, используя: `dlopen (path, RTLD_NOW)`
    Шаг 3: Используйте dlsym (libraryHandle, objectName), чтобы попытаться получить адрес известного символа.

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

Спасибо;)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
520
4

Ответы 4

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

Примечание: это для Linux, но может быть отправной точкой для ваших поисков.

Использованная литература:

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

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

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

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

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

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

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

   #define ForLua(X) X

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

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

Другие вопросы по теме