在我搜索一种确定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
在输出中,您应该检查:
- 如果至少有一个部分名为
__LLVM
- 如果大小大于零
似乎是此处报告的otool
问题。使用 file
获取体系结构列表,然后将体系结构提供给otool
。给定一个带有位码的胖二进制文件,分别表示armv7
、arm64
、i386
和x86_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_64
和i368
的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