I have a static library that is built by other company. I want to know if it's a static library containing bitcode, which command can detect it in terminal?
As it was alread written in other answers,
otool -l yourlib.a | grep __LLVM
is the way to go.
An Apple engineer says using
otool -l yourlib.a | grep bitcode
is not reliable.
Searching for a "bitcode" section is not a reliable way to detect if your files contain embedded bitcode. If you want to do that, search for the "__LLVM" segment. You should be aware that a normal build with the -fembed-bitcode-marker option will produce minimal size embedded bitcode sections without any real content. This is done as a way of testing the bitcode-related aspects of your build without slowing down the build process. The actual bitcode content is included when you do an Archive build.
See also the comments by xCocoa.
It seems, that otool
does not report the bitcode if code for the iPhone Simulator's architecture is included (x86_64 or i386).
You can list the lib's architectures with:
lipo -info yourlib.a
Then you can check for bitcode for each architecture separately, e.g:
otool -arch armv7 -l yourlib.a | grep bitcode
otool -arch arm64 -l yourlib.a | grep bitcode
-fembed-bitcode-marker
and not -fembed-bitcode
(inspect your compiler output), you may get a false positive with these commands, as the bitcode "marker" is present, just not the actual bitcode. This answer has more info on that. –
Evolutionary It is recommended to test against LLVM symbols:
otool -l yourlib.a | grep LLVM
You should get some lines with "__LLVM"
LLVM
? –
Selden Disclaimer: I'm the author of LibEBC.
You can use ebcutil
to see whether bitcode is present in a Mach-O binary or library. You can even use it to extract the embedded bitcode from it.
And if you want to check if a specific file (yourFile.o)
in the static library is bitcode enabled, you can extract the 'staticLibrary.a'
and use the same otool
command. However macOS doesn't allow to extract your staticLibrary.a at times with the default extract utility and most 3rd party tools doesn't work either.
You can follow these steps to check specific .o
files
Get the info of the architecture
lipo -info yourStaticLibrary.a
eg output: armv7 arm64
Extract
yourStaticLibrary.a
for any or both of the above architecturelipo yourStaticLibrary.a -thin armv7 -output yourStaticLibraryarmv7.a
(specify the output path you want to extract to)
You get the
'yourStaticLibraryarmv7.a'
which then can be easily extracted with the default mac unarchiverOn extracting, you then get a folder '
yourStaticLibraryarmv7'
containing all the .o filesotool -l yourFile.o | grep bitcode
or with the specific architectureotool -arch armv7 -l yourFile.o | grep bitcode
If the file is bitcode enabled , you get 'sectname __bitcode' in the commandline
ar -t yourStaticLibraryarmv7.a
to see the list of .o files, and ar -xv yourStaticLibraryarmv7.a yourFile.o
–
Riesling ar:***.a: Inappropriate file type or format
when running ar -t ***.a
, I followed instructions to remove the armv7 slice as stated in the answer –
Escalator - lipo -info lib.a // Your static library
- Check architectures, select your architecture
- lipo lib.a -thin arm64 -output lib_arm64.a // Extract your architecture
- ar -tv lib_arm64.a // List the files
- ar -xv lib_arm64.a yourfile.o // File extracted
- otool -arch armm64 -l yourfile.o | grep bitcode
If the file is bitcode enabled, you get 'sectname __bitcode'
© 2022 - 2024 — McMap. All rights reserved.
ENABLE_BITCODE=NO
it cannot be used from target which hasENABLE_BITCODE=YES
? Is opposite correct too? – Subaltern