【问题标题】:Link ARMv7 library to ARMv7s app将 ARMv7 库链接到 ARMv7s 应用程序
【发布时间】:2012-12-29 07:57:56
【问题描述】:

根据文献,A6 处理器将执行 ARMv7 代码。我的项目链接失败,因为库是为 ARMv7 构建的,但应用程序是为 ARMv7s 构建的。

典型的消息是(当我连接 iPad 4 (Retina) 或 iPhone 5 时):

ld: warning: ignoring file /usr/local/ssl/iphoneos/lib//fipscanister.o, file was built for armv7 which is not the architecture being linked (armv7s): /usr/local/ssl/iphoneos/lib//fipscanister.o
ld: warning: ignoring file /usr/local/ssl/iphoneos/lib//libcrypto.a, file was built for archive which is not the architecture being linked (armv7s): /usr/local/ssl/iphoneos/lib//libcrypto.a

Undefined symbols for architecture armv7s:
  "_FIPS_incore_fingerprint", referenced from:
      _FINGERPRINT_premain in fips_premain.o
  "_FIPS_signature", referenced from:
      _FINGERPRINT_premain in fips_premain.o
  "_FIPS_text_start", referenced from:
      _FINGERPRINT_premain in fips_premain.o
ld: symbol(s) not found for architecture armv7s

我知道我可以通过从有效架构 (VALID_ARCHS) 中删除 ARMv7 来解决此问题,但我不确定为什么,因为 A6 处理器可以执行 A5 目标代码。或者我可以为 ARMv7s 架构执行额外的库构建,但这需要更多的工作并且需要不同的磁盘目录结构。

将 ARMv7 库与 ARMv7s 应用程序链接起来有什么魔力吗?

【问题讨论】:

  • 我猜你的 lib 是为 (armv6 & armv7) 和主项目编译的 (armv7 & armv7s).. 只需将 lib 替换为 (armv7 & armv7s)...问题解决...!
  • 处理器能够执行向后兼容的代码并不意味着链接器也可以处理生成代码的所有版本。要么为 armv7s 重新编译那个“FIPS”库,要么禁用 armv7s。
  • 感谢@Raj - 不,我构建了一个库 - ARMv7(不是 ARMv6 和 ARMv7)。它是使用 iPhoneOS6.0 SDK 构建的。
  • 感谢@H2CO3 - 从技术上讲,FIPS 对象模块(FIPS 库)和 FIPS Capable 库都是使用 ARMv7 构建的。 FIPS Capable 实际上是库,并使用来自 FIPS 对象模块的对象代码。抱歉学究了
  • 感谢@H2CO3 - “要么为 armv7s 重新编译那个“FIPS”库,要么禁用 armv7s”。我试图避免这种情况,但我同意链接器可能存在知识差距。我想我会尝试在 BinUtils 邮件列表中找到问题的根源。

标签: iphone ipad linker armv7


【解决方案1】:

来自 Xcode mailing list 的 Jim Grosbach,链接器开关 -allow_sub_type_mismatches 应该允许 ld 继续链接。来自苹果的ld man pages

 -allow_sub_type_mismatches
             Normally the linker considers different cpu-subtype for ARM
             (e.g. armv4t and armv6) to be different different architec-
             tures that cannot be mixed at build time.  This option
             relaxes that requirement, allowing you to mix object files
             compiled for different ARM subtypes.

还有一个Changelog entry 详细说明了名为LD_ALLOW_CPU_SUBTYPE_MISMATCHES 的环境变量。

但是,我发现 -allow_sub_type_mismatches 根本无法在 Xcode 4.5.2 上运行。在网上搜索会发现一些 Apple RADAR 的 -allow_sub_type_mismatches。例如,请参阅radar://6134468。

希望它现在已修复,但对于 Apple 及其有缺陷的软件,没有什么让我感到惊讶的。

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2013-10-20
    • 2014-05-12
    相关资源
    最近更新 更多