首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用外部符号替换MacOS Mach-O二进制中的静态符号

用外部符号替换MacOS Mach-O二进制中的静态符号
EN

Stack Overflow用户
提问于 2019-07-04 03:08:49
回答 1查看 400关注 0票数 1

我有以下情况:

  • 一种专用的MacOS游戏,静态地将图形框架MoltenVK链接到其主Mach-Ox86-64二进制文件中。
  • 链接到的MoltenVK版本已经很老了。
  • 我有一个新版本的MoltenVK (如果需要的话,还有.dylib编译器、libVulkan等的更新版本,也是dylib形式的)。
  • 旧版本和新版本的MoltenVK兼容ABI,这意味着导出的符号名和函数签名应该从旧版本到新版本的MoltenVK是相同的。

MacOS链接的根本原因是:

  • 游戏没有正确运行在我的版本的macOS (10.15CatalinaBeta3)。由于崩溃回溯,我已经将问题隔离到MoltenVK。
  • 我想测试更新MoltenVK是否会解决这个问题,这既是暂时的解决办法,也是帮助开发人员隔离问题。

是否有可能强迫二进制文件使用在动态加载的.dylib中定义的符号版本,而不是在二进制文件中定义的版本?我希望修补我所拥有的每个.dylib中可用的所有符号,因为如果我只修补一些符号,而不修复其他符号,它可能会中断(假设只有当框架中的每个符号的代码来自同一版本的MoltenVK时,MoltenVK才能工作)。

注意:我无法重新编译游戏的主Mach-O二进制,因为我没有源代码。如果可能的话,我愿意绕过本地系统的安全保障来做到这一点;无论如何,我接受在运行Beta (非生产)操作系统时做一些危险的事情的风险。

我更希望答案和评论集中在对所提问题的技术解决方案上,但如果需要进一步的论证,我将尽可能快地隔离这个问题,以便给游戏开发人员尽可能多的时间,以便在macOS 10.15的最后版本发布之前修复它。如果我保持沉默,问题有可能不会被发现;然后人们会升级到最后的macOS 10.15,并注意到游戏不工作。这对任何人来说都不好玩,因为我们要么呆在Mojave上等待游戏开发者更新他们的游戏,要么在几周或几个月内不玩游戏。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-04 08:59:58

静态链接意味着库可以有效地放入最终的可执行二进制文件中。因此,没有一种简单的技术方法可以连接调用并将它们重定向到其他地方(比如DYLD_INTERPOSEDYLD_INSERT_LIBRARIES允许外部dylib)。

修补二进制文件需要经过每个MoltenVK调用,游戏制作并执行非常繁琐的后处理。所谓后处理,我的意思是:

  1. 使用dlopendlsym串列编写dyld调用。您仍然需要已经在二进制文件中使用的dlopen & dlsym符号(它们是libSystem (又名actually )的一部分,但您仍然需要专用的dyld操作码才能实际使用它们)。最终,您需要将程序集操作码放在二进制代码中,以使一切正常工作。这将是相当艰难的
  2. 触发lldb调试器,准备手动调用dlsym地址,并为每个调用动态修补二进制文件(您可能需要在__TEXT段中使用写权限才能这样做,但这很容易)。如果您知道自己在做什么,这可能是最可行的方法。主要的缺点是它是不稳定的,如果你打破了什么,你会从头开始。
  3. LC_LOAD_DYLIB命令添加到LC_DYLD_INFO_ONLY引用的二进制和dyld操作码中,这将是超级硬

无论如何,您最好的朋友是检查二进制文件的Hopper反汇编程序和MachOView

对x86 (和/或x866-64)程序集的基本知识是必须遵循的。我认为玩原始的源代码可能是一个更可行的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56880169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档