Відповіді:
Ще один варіант lipo; його результат короткий і легший для читання, ніжotool 's.
Приклад:
% 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):
Заголовок Маха
магія cputype cpusubtype caps filetype ncmds sizeofcmds прапори
MH_MAGIC_64 X86_64 ВСІ 0x00 ОБ'ЄКТ 3 336 ПІДСУМКИ_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o):
Заголовок Маха
магія cputype cpusubtype caps filetype ncmds sizeofcmds прапори
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;
Цей приклад не зовсім коректний, оскільки деякі рядки DO відображаються, що не говорять про elf32-sparc-vxworks, але досить легко це адаптувати.
Одним із приємних переваг цього є те objdump, що або подібний варіант, встановлений у більшості операційних систем * nix, тоді як інструменти, запропоновані в інших відповідях, не є.
редагувати Мені просто прийшло в голову, що ОП запитував на 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