Ответы:
Другой вариант 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
%
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
file
часто не получается.
Как уже говорилось ранее, 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 ...
В качестве альтернативы я нашел, что 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
). Возможно, вы захотите создать псевдоним для удобства.
Этот сценарий 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