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

时间:2012-05-16 19:21:15

标签: ios libraries armv7 armv6

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

1 个答案:

答案 0 :(得分:4)

答案是破解armv6库,认为它是一个armv7库。这将使您运行,直到供应商提供库。这样做的原因是因为arm规范要求所有的arm架构都能够运行以前架构生成的代码。因此,如果armv6库告诉链接器它是armv7,处理器应该仍然能够运行代码。当然,你不能走另一条路。在两个库上使用otool -h来查看cputype和cpusubtype。在我的库中,两种cputypes都是12,而子类型是6和9,表明armv6和armv7。 使用十六进制编辑器,查找十六进制字符串0xcefaedfe,它是由于大/小端而反转的标记MH_MAGIC(0xfeedface)。

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

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

是的,这是一个巨大的黑客攻击,但它会让你开始运行。如果您获得了修改后的库,则只需将其删除即可。无需更改代码。如果它适合你,你仍然使用Apple的代码,如果你只是armv6,它将与你运行的代码相同。

相关问题