У меня есть статическая библиотека, созданная другой компанией. Я хочу знать, является ли это статической библиотекой, содержащей битовый код, какая команда может обнаружить ее в терминале?
Как проверить, что статическая библиотека содержит биткод?
Ответы (5)
Как уже было написано в других ответах,
otool -l yourlib.a | grep __LLVM
это путь.
инженер Apple говорит, используя
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
ENABLE_BITCODE=NO
, ее нельзя использовать из цели, у которой есть ENABLE_BITCODE=YES
? Верно ли и обратное?
- person Yevhen Dubinin; 29.06.2016
-fembed-bitcode-marker
, а не -fembed-bitcode
(проверьте вывод вашего компилятора), вы можете получить ложное срабатывание с этими командами, поскольку присутствует маркер битового кода, а не фактический битовый код. Этот ответ содержит больше информации об этом.
- person William Denniss; 09.11.2017
Рекомендуется протестировать символы LLVM:
otool -l yourlib.a | grep LLVM
Вы должны получить несколько строк с "__LLVM"
LLVM
?
- person Paul; 03.02.2016
Отказ от ответственности: я автор LibEBC.
Вы можете использовать ebcutil
, чтобы увидеть, присутствует ли битовый код в двоичном файле Mach-O или библиотеке. Вы даже можете использовать его для извлечения из него встроенного битового кода.
https://github.com/JDevlieghere/LibEBC
И если вы хотите проверить, включен ли битовый код для определенного файла (yourFile.o)
в статической библиотеке, вы можете извлечь 'staticLibrary.a'
и использовать ту же команду otool
. Однако macOS иногда не позволяет извлечь вашу staticLibrary.a с помощью утилиты извлечения по умолчанию, и большинство сторонних инструментов также не работают.
Вы можете выполнить следующие действия, чтобы проверить определенные .o
файлы.
Получить информацию об архитектуре
lipo -info yourStaticLibrary.a
например вывод: armv7 arm64
Извлеките
yourStaticLibrary.a
для любой или обеих вышеперечисленных архитектур.lipo yourStaticLibrary.a -thin armv7 -output yourStaticLibraryarmv7.a
(укажите выходной путь, в который вы хотите извлечь)
Вы получаете
'yourStaticLibraryarmv7.a'
, который затем можно легко извлечь с помощью деархиватора Mac по умолчанию.При извлечении вы получаете папку «
yourStaticLibraryarmv7'
», содержащую все файлы .o.otool -l yourFile.o | grep bitcode
или с определенной архитектуройotool -arch armv7 -l yourFile.o | grep bitcode
Если в файле включен битовый код, вы получите 'sectname __bitcode' в командной строке.
ar -t yourStaticLibraryarmv7.a
, чтобы увидеть список файлов .o, и ar -xv yourStaticLibraryarmv7.a yourFile.o
- person yano; 26.10.2017
ar:***.a: Inappropriate file type or format
при запуске ar -t ***.a
, я следовал инструкциям по удалению фрагмента armv7, как указано в ответе.
- person marchinram; 01.05.2018
Вы можете попробовать: otool -l (файл .o или .a)
и найдите раздел "__bitcode"
Здесь был дан ответ: Как мне сделать xcodebuild статическую библиотеку с включенным биткодом?