确定二进制文件是否包含位码的方法似乎不再有效



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

如何检查框架是否支持 Xcode7 的 BITCODE

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

$ otool -l libName.o | grep __LLVM

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

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

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

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

更新:这是一个应该有位码但上面的命令不返回任何内容的文件示例。它是来自测试文件提供程序的二进制文件。我通过存档和部署为临时生成了它,并确保目标的位码设置已打开。

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

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

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

在输出中,您应该检查:

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

似乎是此处报告的otool问题。使用 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

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

CustomDocumentProviderFileProvider似乎不包含位码:

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

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

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

https://github.com/JDevlieghere/LibEBC

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

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

最新更新