我有以下情况:
.dylib
形式的MoltenVK的较新版本(以及较新版本的SPIRV编译器,libVulkan等,如果需要,也可以dylib形式)。这是MacOS链接之旅的根本原因:
是否可以强制二进制文件使用动态加载的.dylib
中定义的符号版本,而不是二进制文件本身中定义的版本?我想修补我拥有的每个.dylib
中可用的所有符号,因为如果我仅修补某些符号而不修补其他符号,它可能会损坏(大概是MoltenVK仅在框架中的每个符号都来自相同版本的MoltenVK。
注意:由于我没有源代码,因此我无法重新编译游戏的主要Mach-O二进制文件。如果可能的话,我愿意绕过我本地系统上的安全保护措施;无论如何,我都接受在运行Beta(非生产)操作系统时做危险事情的风险。
我希望答案和评论都集中在所提出问题的技术解决方案上,但是如果需要进一步的论证,我试图尽快隔离该问题,以使游戏开发者有更多时间来解决问题。在macOS 10.15的最终版本之前对其进行修复。如果我保持沉默,则该问题有可能不会被发现;然后人们将升级到最终的macOS 10.15,并注意到游戏无法正常工作。这对任何人来说都是不好玩的,因为那样我们要么就呆在Mojave上,等待游戏开发者更新他们的游戏,要么要等上几周或几个月不使用游戏。
答案 0 :(得分:1)
静态链接表示该库已有效烘焙到最终的可执行二进制文件中。因此,没有简单的技术方法来挂接呼叫并将它们重定向到其他地方(例如DYLD_INTERPOSE
或DYLD_INSERT_LIBRARIES
允许使用外部dylib)。
修补二进制文件将需要遍历游戏进行的每个MoltenVK调用,并进行相当繁琐的后期处理。 通过后期处理,我的意思是:
dlopen
和dlsym
串联编写一个程序调用。你仍然会
需要已在二进制文件中使用的dlopen
和dlsym
符号(它们是
libSystem aka C std lib,但是您仍然需要专用的dyld操作码
才能真正使用它们)。最终,您需要将汇编操作码放在二进制文件中的某处,以使所有内容正常工作。这将非常困难。lldb
调试器,准备手动调用的dlsym
地址,并为每个调用动态修补二进制文件(您可能需要在__TEXT
段中具有写权限它,但这是简单的部分)。如果您知道自己在做什么,那可能是最可行的方法。主要缺点是易失性,如果您破坏某些内容,则会从头开始。LC_LOAD_DYLIB
引用的二进制和dyld操作码添加LC_DYLD_INFO_ONLY
命令,这将是超硬 无论如何,最好的朋友是Hopper
反汇编程序和MachOView
来检查二进制文件。
必须紧紧掌握x86(和/或x86-64)组装的基本知识。我认为使用原始源代码可能是一种更可行的选择。