Как определить целевую архитектуру статической библиотеки (.a) в Mac OS X?

128

Мне интересно проверить, создана ли данная статическая библиотека iPhone для ARM или Intel.

Это больше любопытство, чем что-либо еще. Есть ли для этого какой-нибудь специальный инструмент для Mac OS X или BSD? В этом посте приводится пример для Linux.

Justicle
источник

Ответы:

241

Другой вариант lipo; его вывод краток и более читабелен, чем otoolего.

Пример:

% lipo -info /usr/lib/libiodbc.a 
Architectures in the fat file: /usr/lib/libiodbc.a are: x86_64 i386 ppc
% lipo -info libnonfatarchive.a
input file libnonfatarchive.a is not a fat file
Non-fat file: libnonfatarchive.a is architecture: i386
%
Вацлав Славик
источник
Только что проверил это с помощью старого файла PJSIP .a. ARMv7. Спасибо.
Alex Zavatone
69

fileнаверное тебе скажу. otoolконечно должен уметь. Но fileсначала я бы попробовал , например

logan:/Users/logan% file d2
d2: Mach-O executable ppc

Пример с архивом:

logan:/Users/logan% file /usr/lib/libMallocDebug.a
/usr/lib/libMallocDebug.a: Mach-O universal binary with 2 architectures
/usr/lib/libMallocDebug.a (for architecture i386):      current ar archive random library
/usr/lib/libMallocDebug.a (for architecture ppc):       current ar archive
Логан Капальдо
источник
34
По моему опыту fileчасто не получается.
Стефан Шмидт,
4
См. Ответ о липо ниже, всегда работает.
Maciej Swic
Я заметил, что если .a не ранлибирован, файл иногда сообщает меньше информации.
Поль Дю Буа
4
Теперь в 2015 году вам следует использовать липо. См. Ответ ниже.
derFunk
1
К сожалению, это не сработало для нескольких версий ОС.
rmcclellan
53

Как уже говорилось ранее, fileне всегда получается. otool -hv -arch allэто, вероятно, наиболее близкая вещь, которая гарантированно работает - она ​​предоставляет информацию об архитектуре для каждого отдельного объектного файла в библиотеке.

Пример:

% otool -hv /sw/lib/libfftw3.a
Архив: /sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
Заголовок Маха
      magic caucepe cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ВСЕ 0x00 ОБЪЕКТ 3 336 ПОДСЕКЦИЙ_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o):
Заголовок Маха
      magic caucepe cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ВСЕ 0x00 ОБЪЕКТ 3 416 ПОДРАЗДЕЛЕНИЙ_VIA_SYMBOLS
...
Цзяхао Чен
источник
Чтобы добавить к этому ответу, я предпочитаю otool над файлом или липо. Я пробовал file, lipo и otool с жирной библиотекой iOS, и otool был единственным, который показал мне, что он содержит файлы для i386 (iPhone Simulator) и для armv6, armv7 и armv7s (iPhone OS).
Роберто
1
ПРИМЕЧАНИЕ: если вы хотите проверить, толстая ваша библиотека или нет, вы хотите использовать «otool -arch all»; в противном случае он будет сообщать только об одной архитектуре для каждого файла .o. Для быстрого обзора архитектур в вашем .a, "otool -f"
Поль Дю Буа
4

В качестве альтернативы я нашел, что objdumpможет хорошо работать. Например, в своей среде я создаю архивы библиотек с помощью vxWorks, и мне нужно связать их с другими проектами. Чтобы проверить правильность архитектуры архива, я мог бы сделать что-то вроде следующего (синтаксис bash):

if [ "$(objdumpsparc -a ${ARCHIVE_FILE} 2>&1 | ggrep -cvP 'elf32-sparc-vxworks')" -ne "0" ]; then
  echo "Cannot build with ${ARCHIVE_FILE}, it contains one or more non-sparc components"
fi;

Этот пример не совсем правильный, потому что некоторые строки ДЕЙСТВИТЕЛЬНО появляются, в которых не говорится elf32-sparc-vxworks, но это достаточно легко адаптировать.

Одним из приятных преимуществ этого является то objdump, что вариант с аналогичным названием установлен в большинстве операционных систем * nix, тогда как инструменты, предложенные в других ответах, нет.

edit Мне только что пришло в голову, что OP спрашивал о OSX. Мои извинения.

Брайан Ванденберг
источник
Для использования objdumpвы можете установить GNU Binutils через MacPorts. Чтобы увидеть все доступные архитектуры, просто выполните port search binutils. Инструменты для собственной разработки имеют префиксы, чтобы избежать конфликтов (например, gobjdumpвместо objdump). Возможно, вы захотите создать псевдоним для удобства.
Стефан Шмидт,
3

Этот сценарий bash поможет вам программно получить список архитектур в переменной.

list_archs.sh:

#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'

Пример использования:

./list_archs.sh /usr/lib/libc.dylib
x86_64 i386
Бяшка
источник