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

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

答案是破解armv6库认为这是一个armv7库。 这将让你运行,直到供应商提供图书馆。 这样做的原因是因为arm规范要求所有arm架构能够运行由以前的架构生成的代码。 所以如果一个armv6库告诉链接器它是一个armv7,处理器仍然应该能够运行代码。 当然,你不能走另一条路。 在两个库上使用otool -h来查看cputype和cpusubtype。 在我的图书馆,这两个cputypes是12,子types是6和9,表示armv6和armv7。 使用hex编辑器查找hexstring0xcefaedfe,标记MH_MAGIC(0xfeedface)由于big / little endian而颠倒。

接下来就是一个只有0xC的单词。 这是cputype的12。 接下来是一个0x6的单词。 将所有情况更改为0x9。 现在ld会认为你的图书馆是一个armv7,并采取相应的行动。

你可能没有完成,因为armv6可能已经链接了一些拇指库例程。 如果你得到链接错误(我得到了一些switch8和switch16),你需要find它们的达尔文代码。 在Web上查找文件lib1funcs.asm 。 这可能会有你失踪的function。 他们可能被淘汰,所以调整#ifdefs,并确保他们正在编译。 这个文件试图在最后打开一些包含,但是因为它们在最后,所以它们不影响任何东西,所以只是将它们注释掉。

是的,这是一个巨大的黑客攻击,但它可以让你启动和运行。 如果你得到你修改过的库,你只需要把它放进去。不需要更改代码。 如果它适合你,那么你仍然在使用苹果的代码,如果你只是armv6,那么你将会运行相同的代码。