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


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

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

5 110

5 ответов:

другой вариант: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 не всегда срабатывает. 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;

этот пример не совсем корректен, потому что некоторые строки показывают, что не говорят elf32-sparc-vxworks, но это достаточно легко адаптировать.

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

edit мне просто пришло в голову, что ОП спрашивал на OSX. Мое извинение.

этот скрипт поможет вам программно получить список архитектур в переменную.

list_archs.sh:

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

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

./list_archs.sh /usr/lib/libc.dylib
x86_64 i386