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

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

为MacOSX构建,但是针对架构x86_64为iOS模拟器文件’/Users/jonathan/Desktop/macuikit/UIKit.framework/UIKit’构建的dylib链接

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

经过一些挖掘,结果certificate可以运行库的平台确实在二进制文件中指定。 实际上,您可以在您喜欢的Hex编辑器中编辑二进制文件,并使链接器完全跳过此检查。

此信息未在Mach-O标头中指定(正如您已经意识到的那样)。 而是将其指定为加载命令类型。 您可以通过挖掘LLVM源来查看可用的类型。 具体来说,枚举值LC_VERSION_MIN_MACOSXLC_VERSION_MIN_IPHONEOS看起来很有趣。

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

寻找抵消

注意到偏移后,在hex编辑器中跳转到相同的位置并更新它。 我将LC_VERSION_MIN_IPHONEOS (25)修改为LC_VERSION_MIN_MACOSX (24)

保存更新并再次尝试链接。 错误应该消失。 当然,当您尝试实际运行示例时,您将遇到其他问题。 享受LLDB乐趣然后:)