Як визначити цільову архітектуру статичної бібліотеки (.a) на Mac OS X?


128

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

Це більше цікавості, ніж нічого. Чи існує якийсь інструмент для Mac OS X або BSD для цього? Цей пост дає приклад в Linux.

Відповіді:


241

Ще один варіант 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
%

Щойно підтверджено це за допомогою старого файлу PJSIP .a. armv7. Дякую.
Алекс Заватоне

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
Дивіться відповідь про lipo далі, завжди працює.
Maciej Swic

Я помітив, що якщо .a не є ranlib'd, файл інколи повідомляє менше інформації.
Пол Дю Буа

4
Тепер у 2015 році вам слід використовувати lipo. Дивіться відповідь нижче.
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):
Заголовок Маха
      магія 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
...

Просто для додання цієї відповіді я віддаю перевагу otool над файлом або lipo. Я спробував файл, 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;

Цей приклад не зовсім коректний, оскільки деякі рядки DO відображаються, що не говорять про elf32-sparc-vxworks, але досить легко це адаптувати.

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

редагувати Мені просто прийшло в голову, що ОП запитував на 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.