【问题标题】:How to use armv6 third party libraries in an armv7 app?如何在 armv7 应用程序中使用 armv6 第三方库?
【发布时间】:2012-05-16 19:21:14
【问题描述】:

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

【问题讨论】:

    标签: ios libraries armv7 armv6


    【解决方案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 可能已链接到一些 thumbs 库例程中。如果你得到链接错误(我有一些关于 switch8 和 switch16),你需要找到包含它们的达尔文代码。在网上查找文件lib1funcs.asm。这可能会缺少您的功能。它们可能是有条件的,所以调整#ifdefs 并确保它们正在被编译。此文件尝试在末尾打开一些包含,但由于它们位于末尾,因此不会影响任何内容,因此只需将它们注释掉即可。

    是的,这是一个巨大的 hack,但它可以让您启动并运行。如果您获得了修改后的库,您只需将其放入。无需更改代码。如果它适用于您,那么您仍在使用 Apple 的代码,并且如果您仅使用 armv6,它将与您运行的代码相同。

    【讨论】:

    • 更新:Xcode 4.4 改变了汇编程序的完成方式,并且不会开箱即用地编译 lib1funcs.asm 文件。要使用旧的汇编器,请将 -no-integrated-as 添加到使用汇编器的每个目标的项目构建设置的“其他 C 标志”部分。
    • 现在 armv6 已从 Xcode 4.5 中删除,那些坚持使用 armv6 库的人可能不得不求助于上述方法。
    • 不使用 lib1funcs.asm,Apple 有人建议在 compiler-rt 使用 switch8 和 switch16 的版本。编译器-rt/lib/arm/switch8.S 和编译器-rt/lib/arm/switch16.S。 llvm.org/svn/llvm-project/compiler-rt/trunk/lib/arm
    猜你喜欢
    • 2011-12-02
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多