解析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
iPhone在初始应用程序启动后不支持动态链接。虽然您想要做的实际上不需要在任何新的应用程序文本中进行链接,但如果一些dl *函数的行为不像预期的那样,则不会令我感到惊讶。
您可以编写一些特定于平台的代码,但我建议使用各种BSD开发的一种名为“链接器集合”的技术。基本上,您可以对希望执行某些操作的函数进行注释(就像您当前用于标记导出函数一样)。通过一些预处理器魔法,它们会存储注释,有时会在二进制映像中的附加段中存储注释,然后有一个代码来获取该数据并枚举其数据。因此,您只需将所有要使用的函数添加到链接器集合中,然后遍历链接器集合并将其中所有函数与Lua注册。
我知道人们已经在Windows和Linux上运行了这些东西,我已经在Mac OS X和各种\ *BSDs上使用过它。我正在链接 FreeBSD的链接器集合实现,但我没有亲自看过Windows实现。
如果可行,将静态链接集成到链接器脚本中。链接之前,在所有目标文件上执行“nm”,提取全局符号,并生成一个包含所有符号名称到符号值(最好排序 / 散列)映射的 C 文件:
struct symbol { char* name; void * value } symbols = [
{"foo", foo},
{"bar", bar},
...
{0,0}];
如果您想要有选择地暴露一些内容,最好实现一个命名方案,例如使用 Lua_ 前缀来命名所有函数/方法。
或者,您可以创建一个简单的宏
#define ForLua(X) X
然后在源代码中使用 grep 命令查找 ForLua,以选择要包含的符号。
你可以只生成一个地图文件并使用它,不是吗?
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你需要通过
-Wl,--export-dynamic
给链接器传递--export-dynamic
。注意:这是针对 Linux 的,但可以作为您搜索的起点。
参考资料: