【问题标题】:Method to determine whether a binary contains Bitcode no longer seems to work确定二进制文件是否包含 Bitcode 的方法似乎不再有效
【发布时间】:2016-05-03 01:26:16
【问题描述】:

在寻找确定 iOS 二进制文件是否使用 Bitcode 构建的方法时,我发现了以下帖子:

How to check if a framework is BITCODE supported for Xcode7

在这里,建议使用以下方法来确定二进制文件中是否存在位码:

$ otool -l libName.o | grep __LLVM

但是,我已经在几个二进制文件上尝试过,但都没有成功。其中一个是我知道有位代码的库,因为在我更改其项目的标志后,构建错误消失了。其中另一个是用于文件扩展名的二进制文件,使用存档构建。还有一个是苹果手表。

我相信上述所有二进制文件都应该有 Bitcode,但我总是从上述命令中得不到任何结果。

有没有人知道任何其他适用于最新二进制文件的方法?

我正在使用 XCode 7.2 和 10.10.5,以防万一。

更新:这是一个应该有位码的文件的例子,但上面的命令没有返回任何东西。它是来自测试文件提供程序的二进制文件。我通过 Archive and Deploy as Ad Hoc 生成它,并确保目标的 bitcode 设置已启用。

https://www.dropbox.com/s/eyuzs5j1t7nsq6t/CustomDocumentProviderFileProvider?dl=0

【问题讨论】:

  • 您能否提供一个指向使用此方法失败的二进制文件的链接?
  • 当然,我刚刚更新了问题以包含指向文件的链接。谢谢!

标签: ios xcode7 ios-frameworks bitcode xcode7.2


【解决方案1】:

如果您有一个胖二进制文件,那么您需要在特定切片上运行otool -l。例如,在以下示例中,我选择了 arm64:

otool -arch arm64 -l MyFramework.framework/MyFramework | grep -a4 __LLVM

在输出中你应该检查:

  1. 如果至少有一个部分名为__LLVM
  2. 如果大小大于零

【讨论】:

    【解决方案2】:

    截至今天,对我有用的技术是另一个 SO 线程的 this answer 中提到的技术。具体来说,对于名为 MyLib 并包含这两种设备架构的(动态)框架:

    otool -arch armv7 MyLib.framework/MyLib | grep LLVM
    otool -arch arm64 MyLib.framework/MyLib | grep LLVM
    

    【讨论】:

    • 忘记 -l 了?
    • 你的意思是otool选项-I Display the indirect symbol table.
    【解决方案3】:

    免责声明:我是 LibEBC 的作者。

    您可以使用ebcutil 来确定位码是否存在于任何二进制文件(Mach-O、ELF)或库(.a/.dylib/.so)中。

    https://github.com/JDevlieghere/LibEBC

    【讨论】:

      【解决方案4】:

      这似乎是otool 所报告的here 的问题。使用file 获取架构列表,然后将架构提供给otool。给定一个带有armv7arm64i386x86_64 的位码的胖二进制文件:

      $ file lib.a 
      lib.a: Mach-O universal binary with 4 architectures
      lib.a (for architecture armv7): current ar archive random library
      lib.a (for architecture i386):  current ar archive random library
      lib.a (for architecture x86_64):    current ar archive random library
      lib.a (for architecture arm64): current ar archive random library
      
      $ otool -arch armv7 -l lib.a | grep bitcode
      sectname __bitcode
      

      根据这个question,otool 不会报告x86_64i368 的Bitcode。

      CustomDocumentProviderFileProvider 似乎不包含 Bitcode:

      $ file CustomDocumentProviderFileProvider
      CustomDocumentProviderFileProvider: Mach-O universal binary with 2 architectures
      CustomDocumentProviderFileProvider (for architecture armv7):    Mach-O executable arm
      CustomDocumentProviderFileProvider (for architecture arm64):    Mach-O 64-bit executable
      
      $ otool -arch armv7 -l CustomDocumentProviderFileProvider | grep bit
      $
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 2010-11-18
        • 2023-03-19
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多