确定二进制包含Bitcode的方法似乎不再起作用

时间:2016-01-26 13:09:05

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

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

How to check if a framework is BITCODE supported for Xcode7

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

$ otool -l libName.o | grep __LLVM

但是,我在几个二进制文件上尝试了这个并没有成功。其中一个是我知道有bitcode的库,因为在我改变项目标志后,构建错误就消失了。另外一个是文件扩展名的二进制文件,使用Archive构建。另一个是苹果手表。

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

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

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

更新:这是一个应该有bitcode的文件示例,但上面的命令不返回任何内容。它是来自测试文件提供程序的二进制文件。我通过Archive和Deploy as Ad Hoc生成它,并确保bitcode的设置为目标开启。

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

4 个答案:

答案 0 :(得分:3)

这似乎是otool报告here的问题。使用file获取体系结构列表,然后将体系结构提供给otool。给出了armv7arm64i386x86_64的Bitcode胖二进制文件:

$ 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
$

答案 1 :(得分:0)

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

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

https://github.com/JDevlieghere/LibEBC

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果您使用胖二进制文件,则需要在特定的片上运行otool -l。例如,在以下示例中,我选择了arm64:

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

在输出中,您应该检查:

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