我有一个由其他公司构建的静态库。我想知道它是否是一个包含位码的静态库,哪个命令可以在终端中检测到它?
6 回答
正如其他答案中已经写过的那样,
otool -l yourlib.a | grep __LLVM
是要走的路。
一位苹果工程师说使用
otool -l yourlib.a | grep bitcode
不可靠。
搜索“位码”部分并不是检测文件是否包含嵌入式位码的可靠方法。如果您想这样做,请搜索“__LLVM”段。您应该知道,使用 -fembed-bitcode-marker 选项的正常构建将生成最小大小的嵌入式位码部分,而没有任何实际内容。这样做是为了在不减慢构建过程的情况下测试构建中与位码相关的方面。执行存档构建时会包含实际的位码内容。
另请参阅xCocoa的评论。
看来,otool
如果包含 iPhone 模拟器架构的代码(x86_64 或 i386),则不会报告位码。
您可以列出 lib 的架构:
lipo -info yourlib.a
然后您可以分别检查每个架构的位码,例如:
otool -arch armv7 -l yourlib.a | grep bitcode
otool -arch arm64 -l yourlib.a | grep bitcode
建议针对 LLVM 符号进行测试:
otool -l yourlib.a | grep LLVM
你应该得到一些带有“__LLVM”的行
如果您想检查(yourFile.o)
静态库中的特定文件是否启用了位码,您可以提取'staticLibrary.a'
并使用相同的otool
命令。但是 macOS 有时不允许使用默认的提取实用程序提取您的 staticLibrary.a,并且大多数 3rd 方工具也不起作用。
您可以按照以下步骤检查特定.o
文件
获取架构信息
lipo -info yourStaticLibrary.a
例如输出:armv7 arm64
提取
yourStaticLibrary.a
上述任何一个或两个架构lipo yourStaticLibrary.a -thin armv7 -output yourStaticLibraryarmv7.a
(指定要提取到的输出路径)
你得到了
'yourStaticLibraryarmv7.a'
,然后可以使用默认的 mac unarchiver 轻松提取解压后,您会得到一个
yourStaticLibraryarmv7'
包含所有 .o 文件的文件夹otool -l yourFile.o | grep bitcode
或具有特定架构otool -arch armv7 -l yourFile.o | grep bitcode
如果文件启用了位码,您会在命令行中获得“sectname __bitcode”
免责声明:我是 LibEBC 的作者。
您可以使用ebcutil
来查看位码是否存在于 Mach-O 二进制文件或库中。您甚至可以使用它从中提取嵌入的位码。
- lipo -info lib.a // 你的静态库
- 检查架构,选择您的架构
- lipo lib.a -thin arm64 -output lib_arm64.a // 提取你的架构
- ar -tv lib_arm64.a //列出文件
- ar -xv lib_arm64.a yourfile.o // 文件提取
- otool -arch armm64 -l yourfile.o | grep 位码
如果文件启用了位码,你会得到'sectname __bitcode'