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





Вам необходимо передать --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, чтобы выбрать символы, которые вы хотите включить.
Вы можете просто сгенерировать файл карты и использовать его вместо этого, не так ли?