web-dev-qa-db-fra.com

Comment déterminer l'architecture cible de la bibliothèque statique (.a) sous Mac OS X?

Je suis intéressé à vérifier si une bibliothèque statique iPhone donnée a été construite pour ARM ou Intel.

C'est plus de curiosité qu'autre chose. Existe-t-il un outil spécifique à Mac OS X ou BSD pour le faire? Ceci post donne un exemple sous Linux.

118
Justicle

Une autre option est lipo; sa sortie est brève et plus lisible que celle de otool.

Un exemple:

% 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
%
230
Václav Slavík

file vous le dira probablement. otool devrait certainement pouvoir le faire. Mais j’essaierais d’abord file, par exemple.

logan:/Users/logan% file d2
d2: Mach-O executable ppc

Exemple avec archive:

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
66
Logan Capaldo

Comme mentionné précédemment, file ne fonctionne pas toujours. otool -hv -Arch all est probablement la solution la plus proche qui fonctionne - elle fournit des informations sur l’architecture de chaque fichier objet de la bibliothèque.

Exemple:

% otool -hv /sw/lib/libfftw3.a
Archive: /sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
 En-tête de Mach 
 Type de cput magique type de cpusubtypes type de type ncmds sizeofcmds 
 MH_MAGIC_64 X86_64 ALL Objet 0x00 3 336 SUBSECTIONS_VIA_SYMBOLS 
/Sw/lib/lib/libfftw3.a (alloc.o): 
 En-tête de Mach 
 Cputype magique cpusubtype caps type de fichier ncmds sizeofcmds flags 
 MH_MAGIC_64 X86_64 ALL 0x00 OBJET 3 416 SUBSECTIONS_VIA_SYMBOLS 
 ... 
.
53
Jiahao Chen

En guise d'alternative, j'ai trouvé que objdump pouvait bien fonctionner. Par exemple, dans mon environnement, je construis des archives de bibliothèque avec vxWorks et je dois les lier à d'autres projets. Pour vérifier si l'archive est la bonne architecture, je pourrais utiliser l'une des méthodes suivantes (syntaxe 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;

Cet exemple n'est pas tout à fait correct, car certaines lignes ne mentionnent pas elf32-sparc-vxworks, mais il est assez facile de l'adapter.

Un des avantages intéressants de cela est que objdump, ou une variante portant le même nom, est installé sur la plupart des systèmes d'exploitation * nix, alors que les outils suggérés dans les autres réponses ne le sont pas.

edit Il me vient à l'esprit que l'OP demandait sur OSX. Mes excuses.

4
Brian Vandenberg

Ce script bash vous aidera à obtenir par programme une liste d'architectures dans une variable.

list_archs.sh:

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

Exemple d'utilisation:

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