0

这有点令人费解,但让我们试试:

我正在将 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

4 回答 4

3

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

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

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

于 2008-11-04T19:19:05.780 回答
0

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

注意:这适用于 Linux,但可能是您搜索的起点。

参考:

于 2008-11-04T18:39:19.527 回答
0

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

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

如果你想对你公开的内容有选择性,实现一个命名模式可能是最简单的,例如在所有函数/方法前加上 Lua_。

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

   #define ForLua(X) X

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

于 2008-11-04T19:35:49.337 回答
0

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

于 2008-11-04T21:04:42.637 回答