解析Unix/iPhone/Mac OS X版本的PE头文件

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

我正在将 LUA 脚本集成到我的游戏引擎中,以前在 win32 上我已经以一种优美的方式做到了这一点。在 win32 上,我只需将要向 LUA 公开的所有函数标记为导出函数。然后,为了将它们集成到 LUA 中,我会解析可执行文件的 PE 头,取消名称修饰,解析参数等,然后在我的 LUA 运行时中进行注册。这使我能够避免手动注册每个函数以便将它们公开给 LUA。

现在,让我们来到今天,我正在 iPhone 上工作。我已经查看了一些 Unix 的东西,并且接近采取类似的方法,但我不确定它是否会实际起作用。

我不完全熟悉 Unix,但是这是我在 iPhone 上所做的:

步骤1:通过 Objective-C 查询可执行文件路径并获取我的应用程序的路径

步骤2:使用“dlopen(path, RTLD_NOW)”获取我的应用程序的句柄

步骤3:使用“dlsym( libraryHandle, objectName )”尝试获取已知符号的地址。

上述步骤不会真正让我达到想要的结果,但即使如此,它也不起作用。有没有人在 Unix 上做过这种事情?是否有任何头文件或函数可以让我走上正确的道路?

谢谢;)

原文链接 https://stackoverflow.com/questions/262805

点赞
stackoverflow用户28258
stackoverflow用户28258

你需要通过 -Wl,--export-dynamic 给链接器传递 --export-dynamic

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

参考资料:

2008-11-04 18:39:19
stackoverflow用户30506
stackoverflow用户30506

iPhone在初始应用程序启动后不支持动态链接。虽然您想要做的实际上不需要在任何新的应用程序文本中进行链接,但如果一些dl *函数的行为不像预期的那样,则不会令我感到惊讶。

您可以编写一些特定于平台的代码,但我建议使用各种BSD开发的一种名为“链接器集合”的技术。基本上,您可以对希望执行某些操作的函数进行注释(就像您当前用于标记导出函数一样)。通过一些预处理器魔法,它们会存储注释,有时会在二进制映像中的附加段中存储注释,然后有一个代码来获取该数据并枚举其数据。因此,您只需将所有要使用的函数添加到链接器集合中,然后遍历链接器集合并将其中所有函数与Lua注册。

我知道人们已经在Windows和Linux上运行了这些东西,我已经在Mac OS X和各种\ *BSDs上使用过它。我正在链接 FreeBSD的链接器集合实现,但我没有亲自看过Windows实现。

2008-11-04 19:19:05
stackoverflow用户33006
stackoverflow用户33006

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

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

如果您想要有选择地暴露一些内容,最好实现一个命名方案,例如使用 Lua_ 前缀来命名所有函数/方法。

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

   #define ForLua(X) X

然后在源代码中使用 grep 命令查找 ForLua,以选择要包含的符号。

2008-11-04 19:35:49
stackoverflow用户88888888
stackoverflow用户88888888

你可以只生成一个地图文件并使用它,不是吗?

2008-11-04 21:04:42