2015-09-24 31 views

回答

0

建議對LLVM符號進行測試:

otool -l yourlib.a | grep的LLVM

你應該得到一些線, 「__LLVM」

+1

我試了一下,但沒有發現任何東西,我確信yourlib.a包含位碼。 – xCocoa

+0

你有存檔嗎? – SeikoTheWiz

+0

您能否指出您的索賠來源?我爲什麼要grep for'LLVM'? – Paul

29

由於這是alread寫在其他的答案,

otool -l yourlib.a | grep bitcode 

otool -l yourlib.a | grep __LLVM 

是要走的路。

但在我的情況下(XCode 7,靜態iOS庫),這沒有奏效(另請參閱xCocoa的評論)。

看來,otool不報告位代碼,如果包括iPhone模擬器的架構代碼(x86_64或arm64)。

你可以列出的lib的架構:

lipo -info yourlib.a 

然後你就可以單獨檢查位碼爲每建築,e.g:

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

是否正確:如果靜態庫不是用'ENABLE_BITCODE = NO'構建的,它不能用於具有'ENABLE_BITCODE = YES'的目標?相對正確嗎? –

+1

@EugeneDubinin Bitcode只是一些額外的信息,所以除了稍微增加的大小之外,它沒有任何傷害。但是,二進制碼中缺少位代碼意味着您無法將其鏈接到需要位代碼的目標(即啓用位代碼)。 – Mazyod

+0

請注意,如果您使用'-fembed-bitcode-marker'編譯而不是'-fembed-bitcode'(檢查編譯器輸出),則可能會因爲這些命令而導致誤報,因爲存在位標記「marker」只是不是實際的位碼。 [這個答案](https://stackoverflow.com/a/34965178/72176)有更多的信息。 –

3

免責聲明:我LibEBC的作者。

您可以使用ebcutil來查看Mach-O二進制文件或庫中是否存在位代碼。你甚至可以用它從中提取嵌入的位碼。

https://github.com/JDevlieghere/LibEBC

+0

我嘗試過使用該庫,但在最新的macOS上,它似乎根本沒有編譯。 – jarora

+0

隨時在GitHub上打開一個問題。 – Jonas

+0

https://github.com/JDevlieghere/LibEBC/issues/5 – jarora

1

如果你想檢查是否在靜態庫中的特定文件(yourFile.o)是位碼啓用後,您可以提取'staticLibrary.a'並使用相同的otool命令。但是,macOS不允許使用默認提取實用程序提取staticLibrary.a,大多數第三方工具也無法運行。

您可以按照下列步驟檢查特定.o文件

  1. 獲取架構

    脂-info yourStaticLibrary的信息。一個

例如輸出:ARMv7的arm64

  • 提取yourStaticLibrary.a用於上述架構

    脂yourStaticLibrary.a - 變薄的ARMv7 -output的任何者或兩者yourStaticLibraryarmv7.a

  • (指定要提取到輸出路徑)

  • 你得到,然後可以使用默認MAC容易取出取檔

  • 在提取'yourStaticLibraryarmv7.a',你再得到一個文件夾'yourStaticLibraryarmv7'包含所有.o文件

  • otool -l yourFile.o | grep bitcode 或與特定架構

    otool -arch的ARMv7 -l yourFile.o | grep的位碼

  • 如果該文件已啓用位碼,你在命令行

    +0

    默認的mac unarchiver讓我感到悲傷,所以你可以試試這個命令'ar -t yourStaticLibraryarmv7.a'來查看.o文件列表,並且'ar -xv yourStaticLibraryarmv7.a yourFile.o' – yano