我有两个 3rd 方库。一个只有 armv6 的构建,另一个只有 armv7 的构建。我需要在我的 iOS 企业应用程序中同时使用它们。我已经要求 armv6 库供应商提供 armv7 版本,但他们无法提供。(注意:我已经得到了答案并将提供它。其他人在评论中提出了这个问题并且没有足够的空间来回答,所以我创建了自己的问题,并将提供我的答案。)
1 回答
答案是破解 armv6 库,使其认为它是 armv7 库。这将使您运行,直到供应商提供库。之所以可行,是因为 arm 规范要求所有 arm 架构都能够运行由以前的架构生成的代码。因此,如果 armv6 库告诉链接器它是 armv7,处理器应该仍然能够运行代码。当然,你不能走另一条路。在这两个库上使用 otool -h 来查看 cputype 和 cpusubtype。在我的库中,两种 cputype 为 12,子类型为 6 和 9,表示 armv6 和 armv7。使用十六进制编辑器,查找十六进制字符串 0xcefaedfe,它是标记 MH_MAGIC (0xfeedface) 由于大/小端而反转。
之后,整个单词只有 0xC。那是cputype的12。接下来是 0x6 的单词。在所有情况下将其更改为 0x9。现在 ld 会认为你的库是 armv7,并采取相应的行动。
您可能还没有完成,因为 armv6 可能已经链接到一些拇指库例程中。如果你得到链接错误(我有一些关于 switch8 和 switch16),你需要找到包含它们的达尔文代码。在网上查找文件lib1funcs.asm。这可能会有你缺少的功能。它们可能是有条件的,所以调整#ifdefs 并确保它们正在被编译。这个文件试图在最后打开一些包含,但由于它们在最后,它们不会影响任何东西,所以只需将它们注释掉。
是的,这是一个巨大的 hack,但它可以让你启动并运行。如果您获得了修改后的库,您只需将其放入。无需更改代码。如果它对您有用,那么您仍在使用 Apple 的代码,并且如果您仅使用 armv6,它将与您运行的代码相同。