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.
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
%
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
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 ... .
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.
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