如何检查一个静态库是否包含位码?

13 浏览
0 Comments

如何检查一个静态库是否包含位码?

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

0
0 Comments

问题的出现原因是作者想要检查一个静态库是否包含位码(bitcode),并且尝试使用LibEBC库来实现这个目标。然而,在最新的macOS系统上,LibEBC似乎无法编译。

解决方法是作者提到了一个工具ebcutil,可以用来检查Mach-O二进制文件或库中是否存在位码,并且还可以用它来提取嵌入的位码。作者建议在GitHub上打开一个问题,以便寻求帮助解决这个编译问题。

以上是关于作者遇到的问题以及解决方法的整理。

0
0 Comments

如何检查静态库是否包含位码?

检查静态库是否包含位码是一个常见的需求,可以通过以下方法实现:

1. 使用otool命令检查静态库中是否包含LLVM符号:

otool -l yourlib.a | grep LLVM

如果输出结果中包含"__LLVM"字样,则说明静态库包含位码。

2. 如果以上方法没有找到任何结果,但你确定静态库包含位码,那可能是因为你没有以"Archive"方式进行构建。在构建静态库时,确保选择"Build for Archive"选项。

3. 如果对以上方法仍有疑问,你可以参考这个答案,该答案中提供了关于搜索"__LLVM"的更多信息。

希望以上方法对你检查静态库是否包含位码有所帮助!

0
0 Comments

如其他答案中已经提到的,

otool -l yourlib.a | grep __LLVM

是正确的方法。

一位Apple工程师表示,使用

otool -l yourlib.a | grep bitcode

不可靠的

搜索"bitcode"部分并不是一种可靠的检测文件是否包含嵌入式bitcode的方法。如果你想做到这一点,应该搜索"__LLVM"段。你应该知道,使用-fembed-bitcode-marker选项进行的正常构建将生成最小大小的嵌入式bitcode部分,而没有任何实际内容。这样做是为了测试构建过程中与bitcode相关的方面,而不会拖慢构建过程。只有在进行存档构建时,才会包含实际的bitcode内容。

还可以参考xCocoa的评论。

看起来,如果包括了iPhone模拟器架构的代码(x86_64或i386),otool将不会报告bitcode。

您可以使用以下命令列出库的架构:

lipo -info yourlib.a

然后可以分别检查每个架构的bitcode,例如:

otool -arch armv7 -l yourlib.a  | grep bitcode
otool -arch arm64 -l yourlib.a  | grep bitcode

以下说法是否正确:如果静态库没有使用ENABLE_BITCODE=NO进行构建,则无法从使用ENABLE_BITCODE=YES的目标中使用它?反之亦然吗?

Bitcode只是一些额外的信息,因此除了稍微增加一点大小外,它不会造成任何伤害。然而,二进制文件中缺少bitcode意味着无法将其链接到需要bitcode的目标上(即启用了bitcode)。

请注意,如果您使用-fembed-bitcode-marker而不是-fembed-bitcode(检查编译器输出),您可能会在这些命令中得到错误的结果,因为bitcode的"标记"是存在的,只是实际的bitcode不存在。有关更多信息,请参考此答案

根据's的答案,您可以通过在otool结果中使用grep搜索bitcode,然后查看在此之后的第4行的大小字段来检查是否出现错误的结果(可以使用-A 4参数查看grep匹配后的下4行)。如果大小为1,则意味着未设置-fembed-bitcode,并且库不包含bitcode。

0