我有以下情况:
.dylib编译器、libVulkan等的更新版本,也是dylib形式的)。MacOS链接的根本原因是:
是否有可能强迫二进制文件使用在动态加载的.dylib中定义的符号版本,而不是在二进制文件中定义的版本?我希望修补我所拥有的每个.dylib中可用的所有符号,因为如果我只修补一些符号,而不修复其他符号,它可能会中断(假设只有当框架中的每个符号的代码来自同一版本的MoltenVK时,MoltenVK才能工作)。
注意:我无法重新编译游戏的主Mach-O二进制,因为我没有源代码。如果可能的话,我愿意绕过本地系统的安全保障来做到这一点;无论如何,我接受在运行Beta (非生产)操作系统时做一些危险的事情的风险。
我更希望答案和评论集中在对所提问题的技术解决方案上,但如果需要进一步的论证,我将尽可能快地隔离这个问题,以便给游戏开发人员尽可能多的时间,以便在macOS 10.15的最后版本发布之前修复它。如果我保持沉默,问题有可能不会被发现;然后人们会升级到最后的macOS 10.15,并注意到游戏不工作。这对任何人来说都不好玩,因为我们要么呆在Mojave上等待游戏开发者更新他们的游戏,要么在几周或几个月内不玩游戏。
发布于 2019-07-04 08:59:58
静态链接意味着库可以有效地放入最终的可执行二进制文件中。因此,没有一种简单的技术方法可以连接调用并将它们重定向到其他地方(比如DYLD_INTERPOSE或DYLD_INSERT_LIBRARIES允许外部dylib)。
修补二进制文件需要经过每个MoltenVK调用,游戏制作并执行非常繁琐的后处理。所谓后处理,我的意思是:
dlopen和dlsym串列编写dyld调用。您仍然需要已经在二进制文件中使用的dlopen & dlsym符号(它们是libSystem (又名actually )的一部分,但您仍然需要专用的dyld操作码才能实际使用它们)。最终,您需要将程序集操作码放在二进制代码中,以使一切正常工作。这将是相当艰难的。lldb调试器,准备手动调用dlsym地址,并为每个调用动态修补二进制文件(您可能需要在__TEXT段中使用写权限才能这样做,但这很容易)。如果您知道自己在做什么,这可能是最可行的方法。主要的缺点是它是不稳定的,如果你打破了什么,你会从头开始。LC_LOAD_DYLIB命令添加到LC_DYLD_INFO_ONLY引用的二进制和dyld操作码中,这将是超级硬无论如何,您最好的朋友是检查二进制文件的Hopper反汇编程序和MachOView。
对x86 (和/或x866-64)程序集的基本知识是必须遵循的。我认为玩原始的源代码可能是一个更可行的选择。
https://stackoverflow.com/questions/56880169
复制相似问题