链接到 OSX 上的 iOS 模拟器二进制文件

2024-03-31

我很好奇如果我链接到 Mac 应用程序中的 iOS 模拟器框架会发生什么。因此,我将 UIKit 复制到它自己的文件夹中(因此框架搜索路径不会包含所有 iOS 模拟器框架,就像 CoreFoundation 在 Mac 和 iOS 上都存在但具有不同的标头一样),并将其拖到 Xcode 中的链接部分。 Xcode 给我的错误是:

为 MacOSX 构建,但链接到为 iOS Simulator 构建的 dylib 文件“/Users/jonathan/Desktop/macuikit/UIKit.framework/UIKit” 架构 x86_64

两种架构都是x86_64,所以它怎么知道框架是专门针对iOS模拟器的,我删除了Info.plist之类的所有对iOS的引用,甚至尝试删除除UIKit二进制文件之外的所有内容,但出现了相同的错误。二进制文件本身是否有一些东西告诉链接器它可以在哪个平台上运行,而不仅仅是架构?我查看了 Mach-O 标头,但只有 CPU 类型和子类型字段,并且都没有预期的模拟器值。


经过一番挖掘,事实证明该库可以运行的平台确实在二进制文件中指定了。事实上,您可以在您最喜欢的十六进制编辑器中编辑二进制文件,并使链接器完全跳过此检查。

该信息未在 Mach-O 标头中指定(正如您已经意识到的那样)。相反,它被指定为加载命令类型。您可以通过挖掘来查看可用的类型LLVM 来源 http://llvm.org/docs/doxygen/html/namespacellvm_1_1MachO.html#a4ccbfa6d3acc39bbdda60a4229962b16。具体来说,枚举值LC_VERSION_MIN_MACOSX and LC_VERSION_MIN_IPHONEOS看起来很有趣。

现在,在我们的二进制文件中找到它的偏移量。打开同样的MachOView(或任何其他编辑器/查看器或您的选择)并记下偏移量:

记下偏移量后,在十六进制编辑器中跳转到相同位置并更新它。我修改了LC_VERSION_MIN_IPHONEOS(25) 至LC_VERSION_MIN_MACOSX (24)

保存更新并再次尝试链接。错误应该消失。当然,当您尝试实际运行示例时,您会遇到其他问题。从...中得到快乐LLDB then :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接到 OSX 上的 iOS 模拟器二进制文件 的相关文章

随机推荐