我有以下情况:
.dylib
(带有SPIRV编译器,libVulkan等更新版本,如果需要,也可以dylib形式)。进入MacOS链接的根本原因是:
是否可以强制二进制文件使用动态加载中定义的符号版本,.dylib
而不是二进制文件本身中定义的版本?我想修补我拥有的每个符号中的所有符号.dylib
,因为如果我仅修补一些符号而不修补其他符号,它可能会损坏(大概是MoltenVK仅在框架中每个符号的代码都来自同一版本的MoltenVK时才有效) )。
注意:由于我没有源代码,因此无法重新编译游戏的主要Mach-O二进制文件。如果可能的话,我愿意绕过本地系统上的安全保护措施;无论如何,我都会在运行Beta(非生产)操作系统时有做危险事情的风险。
我希望答案和评论都集中在所提出问题的技术解决方案上,但是如果需要进一步的论证,我将尝试尽快隔离该问题,以便游戏开发人员有尽可能多的时间来修复该问题。 macOS 10.15的最终版本。如果我保持沉默,则该问题有可能不会被检测到。然后人们将升级到最终的macOS 10.15,并注意到游戏无法正常工作。这对任何人来说都是不好玩的,因为那样我们要么就呆在Mojave上,等待游戏开发者更新他们的游戏,要么就不玩游戏数周或数月。
静态链接意味着该库可以有效地烘焙到最终的可执行二进制文件中。因此,没有简单的技术方法来挂接呼叫并将它们重定向到其他地方(例如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)组装的基本知识。我认为使用原始源代码可能是一种更可行的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句