Мне интересно проверить, была ли данная статическая библиотека iPhone построена для ARM или Intel.
Это больше любопытства, чем что-либо. Есть ли какой-то конкретный инструмент для Mac OS X или BSD? Этот пост дает пример в Linux.
Мне интересно проверить, была ли данная статическая библиотека iPhone построена для ARM или Intel.
Это больше любопытства, чем что-либо. Есть ли какой-то конкретный инструмент для Mac OS X или BSD? Этот пост дает пример в Linux.
Другой вариант: 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
не всегда работает. otool -hv -arch all
, вероятно, самая близкая вещь, которая гарантирована для работы - она предоставляет информацию о архитектуре для каждого отдельного объектного файла в библиотеке.
Пример:
% otool -hv /sw/lib/libfftw3.a Archive : /sw/lib/libfftw3.a /sw/lib/libfftw3.a(align.o): Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 336 SUBSECTIONS_VIA_SYMBOLS /sw/lib/libfftw3.a(alloc.o): Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 416 SUBSECTIONS_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, тогда как инструменты, предлагаемые в других ответах, не являются.
edit Мне пришло в голову, что OP спрашивал OSX. Мои извинения.
Этот bash script поможет вам программно получить список архитектур в переменную.
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