解析Unix / iPhone / Mac OS X版PE标头

时间:2008-11-04 18:18:08

标签: iphone lua

这有点令人费解,但试试看:

我正在将LUA脚本集成到我的游戏引擎中,我在过去的win32中以优雅的方式完成了这项工作。在win32上我所做的就是将我想要暴露给LUA的所有函数标记为导出函数。然后,为了将它们集成到LUA中,我将解析可执行文件的PE头,解开名称,解析参数等,然后使用我的LUA运行时注册它们。这使我可以避免单独手动注册每个函数,只是为了将它们暴露给LUA。

现在,闪现今天,我正在开发iPhone。我已经查看了一些Unix的东西,并且我已经非常接近采用类似的方法,但是我不确定它是否真的有效。

我对Unix并不完全熟悉,但这是我目前在iPhone上所拥有的:

    步骤1:通过objective-C查询可执行路径并获取我的应用程序的路径
    第2步:使用dlopen来获取我的应用程序的句柄:`dlopen(path,RTLD_NOW)`
    第3步:使用`dlsym(libraryHandle,objectName)`来尝试获取已知符号的地址。

    上述步骤实际上并没有让我到达我想要的地方,但即使这样也行不通。有没有人有经验在Unix上做这类事情?是否有任何标题或功能我可以谷歌让我走上正轨?

    感谢;)

4 个答案:

答案 0 :(得分:3)

iPhone初始应用程序启动后不支持动态链接。虽然您想要做的事实上并不需要在任何新的应用程序TEXT中进行链接,但是如果发现某些dl *函数的行为不符合预期,我不会感到震惊。

您可能能够编写一些特定于平台的代码,但我建议使用由各种BSD开发的称为链接器集的技术。基本上,您可以注释要执行某些操作的函数(就像您当前将它们标记为导出一样)。通过一些预处理器魔术,它们存储注释,有时在二进制图像中的额外段中,然后具有抓取该数据并枚举其数据的代码。因此,您只需将所需的所有函数添加到链接器集中,然后遍历链接器集并使用lua注册其中的所有函数。

我知道人们已经在Windows和Linux上运行并运行了这些东西,我在Mac OS X和各种* BSD上使用过它。我是FreeBSD linker_set实现的linking,但我没有亲自见过Windows实现。

答案 1 :(得分:0)

您需要将--export-dynamic传递给链接器(通过-Wl,--export-dynamic)。

注意:这适用于Linux,但可以作为搜索的起点。

参考文献:

答案 2 :(得分:0)

如果选择静态链接,请将其集成到链接描述文件中。在链接之前,对所有目标文件执行“nm”,提取全局符号,并生成包含所有符号名称到符号值的(最好是有序/散列)映射的C文件:

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

如果您希望选择所公开的内容,则最简单的方法是实现命名方案,例如:使用Lua _。前缀所有函数/方法。

或者,您可以创建一个简单的宏

   #define ForLua(X) X

然后grep ForLua的源代码,选择要合并的符号。

答案 3 :(得分:0)

你可以生成一个mapfile而不是使用它吗?