如何在 armv7 应用程序中使用 armv6 第三方库



我有两个第三方库。 一个只有一个 armv6 的构建,另一个只有一个 armv7 的构建。 我需要在我的iOS企业应用程序中使用它们。 我已经要求 armv6 库供应商提供 armv7 版本,但他们无法这样做。 (注意:我已经得到了答案,并将提供它。 其他人在评论中问了这个问题,没有足够的空间来回答,所以我创建了自己的问题,并将提供我的答案。

答案是破解 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 并确保它们正在编译。 此文件尝试在末尾打开一些包含,但由于它们位于末尾,因此它们不会影响任何内容,因此只需将它们注释掉即可。

是的,这是一个巨大的黑客,但它可以让您启动并运行。 如果你得到了修改后的库,你只需要把它放进去。 无需更改代码。 如果它适合您,那么您仍在使用 Apple 的代码,如果您只是 armv6,它将与您运行的代码相同。

最新更新