Как проверить, что статическая библиотека содержит биткод?

У меня есть статическая библиотека, созданная другой компанией. Я хочу знать, является ли это статической библиотекой, содержащей битовый код, какая команда может обнаружить ее в терминале?


person xCocoa    schedule 24.09.2015    source источник


Ответы (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
person Oliver    schedule 13.10.2015
comment
Верно ли следующее: если статическая библиотека не была собрана с ENABLE_BITCODE=NO, ее нельзя использовать из цели, у которой есть ENABLE_BITCODE=YES? Верно ли и обратное? - person Yevhen Dubinin; 29.06.2016
comment
@EugeneDubinin Бит-код - это просто дополнительная информация, поэтому ее наличие не приносит вреда, кроме немного увеличенного размера. Однако отсутствие битового кода в двоичном файле означает, что вы не можете связать его с целью, для которой требуется битовый код (т. е. битовый код включен). - person Mazyod; 01.08.2016
comment
Имейте в виду, что если вы компилируете с помощью -fembed-bitcode-marker, а не -fembed-bitcode (проверьте вывод вашего компилятора), вы можете получить ложное срабатывание с этими командами, поскольку присутствует маркер битового кода, а не фактический битовый код. Этот ответ содержит больше информации об этом. - person William Denniss; 09.11.2017
comment
Следуя ответу @WilliamDenniss, вы можете проверить наличие ложного срабатывания, выполнив поиск битового кода в результатах otool, а затем просмотрев поле размера через 4 строки после этого. (вы можете использовать параметр -A 4, чтобы увидеть следующие 4 строки после совпадения grep) Если размер равен 1, это означает, что -fembed-bitcode не был установлен и библиотека не содержит биткод. - person Deemoe; 18.07.2018

Рекомендуется протестировать символы LLVM:

otool -l yourlib.a | grep LLVM

Вы должны получить несколько строк с "__LLVM"

person SeikoTheWiz    schedule 24.09.2015
comment
Я пробовал, но ничего не нашел, я уверен, что yourlib.a содержит биткод. - person xCocoa; 25.09.2015
comment
Вы строили для Архива? - person SeikoTheWiz; 25.09.2015
comment
Не могли бы вы указать источник вашего утверждения? Почему я должен искать LLVM? - person Paul; 03.02.2016
comment
См. этот ответ относительно поиска __LLVM. - person Quintin Willison; 09.06.2016

Отказ от ответственности: я автор LibEBC.

Вы можете использовать ebcutil, чтобы увидеть, присутствует ли битовый код в двоичном файле Mach-O или библиотеке. Вы даже можете использовать его для извлечения из него встроенного битового кода.

https://github.com/JDevlieghere/LibEBC

person Jonas    schedule 09.12.2016
comment
Я пытался использовать библиотеку, но в последней версии macOS она вообще не компилируется. - person jarora; 09.11.2017
comment
Не стесняйтесь открывать вопрос на GitHub. - person Jonas; 10.11.2017

И если вы хотите проверить, включен ли битовый код для определенного файла (yourFile.o) в статической библиотеке, вы можете извлечь 'staticLibrary.a' и использовать ту же команду otool. Однако macOS иногда не позволяет извлечь вашу staticLibrary.a с помощью утилиты извлечения по умолчанию, и большинство сторонних инструментов также не работают.

Вы можете выполнить следующие действия, чтобы проверить определенные .o файлы.

  1. Получить информацию об архитектуре

    lipo -info yourStaticLibrary.a
    

например вывод: armv7 arm64

  1. Извлеките yourStaticLibrary.a для любой или обеих вышеперечисленных архитектур.

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

(укажите выходной путь, в который вы хотите извлечь)

  1. Вы получаете 'yourStaticLibraryarmv7.a', который затем можно легко извлечь с помощью деархиватора Mac по умолчанию.

  2. При извлечении вы получаете папку «yourStaticLibraryarmv7'», содержащую все файлы .o.

  3. otool -l yourFile.o | grep bitcode или с определенной архитектурой

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

Если в файле включен битовый код, вы получите 'sectname __bitcode' в командной строке.

person Naishta    schedule 04.05.2017
comment
деархиватор Mac по умолчанию меня огорчал, поэтому вы можете попробовать эту команду ar -t yourStaticLibraryarmv7.a, чтобы увидеть список файлов .o, и ar -xv yourStaticLibraryarmv7.a yourFile.o - person yano; 26.10.2017
comment
@yano У меня это не работает. Я получаю ar:***.a: Inappropriate file type or format при запуске ar -t ***.a, я следовал инструкциям по удалению фрагмента armv7, как указано в ответе. - person marchinram; 01.05.2018

Вы можете попробовать: otool -l (файл .o или .a)

и найдите раздел "__bitcode"

Здесь был дан ответ: Как мне сделать xcodebuild статическую библиотеку с включенным биткодом?

person gheni4    schedule 24.09.2015
comment
Моя разработка - Xcode7 и EI Capitan 10.11.1, я использовал команду, но не могу найти раздел __bitcode - person xCocoa; 25.09.2015