43

我有一个由其他公司构建的静态库。我想知道它是否是一个包含位码的静态库,哪个命令可以在终端中检测到它?

4

6 回答 6

64

正如其他答案中已经写过的那样,

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
于 2015-10-13T14:46:26.497 回答
2

建议针对 LLVM 符号进行测试:

otool -l yourlib.a | grep LLVM

你应该得到一些带有“__LLVM”的行

于 2015-09-24T15:03:09.327 回答
2

如果您想检查(yourFile.o)静态库中的特定文件是否启用了位码,您可以提取'staticLibrary.a'并使用相同的otool命令。但是 macOS 有时不允许使用默认的提取实用程序提取您的 staticLibrary.a,并且大多数 3rd 方工具也不起作用。

您可以按照以下步骤检查特定.o文件

  1. 获取架构信息

    lipo -info yourStaticLibrary.a
    

例如输出:armv7 arm64

  1. 提取yourStaticLibrary.a上述任何一个或两个架构

    lipo yourStaticLibrary.a -thin armv7 -output yourStaticLibraryarmv7.a
    

(指定要提取到的输出路径)

  1. 你得到了'yourStaticLibraryarmv7.a',然后可以使用默认的 mac unarchiver 轻松提取

  2. 解压后,您会得到一个yourStaticLibraryarmv7'包含所有 .o 文件的文件夹

  3. otool -l yourFile.o | grep bitcode 或具有特定架构

    otool -arch armv7 -l yourFile.o  | grep bitcode
    

如果文件启用了位码,您会在命令行中获得“sectname __bitcode”

于 2017-05-04T09:13:07.303 回答
2

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

您可以使用ebcutil来查看位码是否存在于 Mach-O 二进制文件或库中。您甚至可以使用它从中提取嵌入的位码。

https://github.com/JDevlieghere/LibEBC

于 2016-12-09T12:31:19.017 回答
0
  1. lipo -info lib.a // 你的静态库
  2. 检查架构,选择您的架构
  3. lipo lib.a -thin arm64 -output lib_arm64.a // 提取你的架构
  4. ar -tv lib_arm64.a //列出文件
  5. ar -xv lib_arm64.a yourfile.o // 文件提取
  6. otool -arch armm64 -l yourfile.o | grep 位码

如果文件启用了位码,你会得到'sectname __bitcode'

于 2021-10-13T13:02:16.853 回答
-1

您可以尝试:otool -l(.o 或 .a 文件)

并寻找“__bitcode”部分

它在这里得到了回答: 如何在启用 Bitcode 的情况下 xcodebuild 一个静态库?

于 2015-09-24T11:06:58.953 回答