【问题标题】:Parsing Unix/iPhone/Mac OS X version of PE headers解析 Unix/iPhone/Mac OS X 版本的 PE 标头
【发布时间】:2010-09-20 17:45:13
【问题描述】:

这有点复杂,但让我们试试:

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

现在,快进到今天我在 iPhone 上工作的地方。我浏览了一些 Unix 的东西,并且非常接近采用类似的方法,但是我不确定它是否真的有效。

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

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

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

谢谢;)

【问题讨论】:

    标签: iphone lua


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      注意:这是针对 Linux 的,但可以作为您搜索的起点。

      参考资料:

      【讨论】:

        【解决方案3】:

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

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

        如果您想有选择性地公开内容,那么实现命名架构可能是最简单的,例如用 Lua_ 作为所有函数/方法的前缀。

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

           #define ForLua(X) X
        

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

        【讨论】:

          【解决方案4】:

          您可以只生成一个映射文件并使用它,不是吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-03-20
            • 1970-01-01
            • 2011-01-02
            • 2011-12-30
            • 2014-12-02
            • 2011-02-20
            • 2012-10-21
            相关资源
            最近更新 更多