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


128

Je souhaite vérifier si une bibliothèque statique iPhone donnée a été créée pour ARM ou Intel.

C'est plus de la curiosité qu'autre chose. Existe-t-il une sorte d'outil spécifique à Mac OS X ou BSD pour faire cela? Cet article donne un exemple sous Linux.

Réponses:


241

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

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
%

Je viens de vérifier cela avec un ancien fichier PJSIP .a. armv7. Merci.
Alex Zavatone

69

filevous le dira probablement. otooldevrait certainement être en mesure de le faire. Mais j'essaierais d' fileabord, 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

34
Dans mon expérience fileéchoue souvent.
Stefan Schmidt

4
Voir la réponse sur la lipo plus bas, fonctionne toujours.
Maciej Swic

J'ai remarqué que si le .a n'est pas publié, le fichier rapporte parfois moins d'informations.
Paul Du Bois

4
Maintenant, en 2015, vous devriez utiliser le lipo. Voir la réponse ci-dessous.
derFunk

1
Malheureusement, cela n'a pas fonctionné pour plusieurs versions de système d'exploitation.
rmcclellan

53

Comme mentionné précédemment, filene fonctionne pas toujours. otool -hv -arch allest probablement la chose la plus proche qui est garantie de fonctionner - il donne des informations d'architecture pour 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):
Tête de Mach
      magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 TOUS 0x00 OBJET 3336 SUBSECTIONS_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o):
Tête de Mach
      magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 TOUS 0x00 OBJET 3416 SUBSECTIONS_VIA_SYMBOLS
...

Juste pour ajouter à cette réponse, je préfère otool au fichier ou au lipo. J'ai essayé file, lipo et otool avec une bibliothèque iOS Fat et otool était le seul à me montrer qu'il contenait des fichiers pour i386 (iPhone Simulator) et pour armv6, armv7 et armv7s (iPhone OS).
Roberto

1
NOTE: si vous voulez vérifier si votre bibliothèque est grosse ou non, vous voulez utiliser "otool -arch all"; sinon, il ne rapportera qu'une seule architecture par fichier .o. Pour un aperçu rapide des architectures de votre .a, "otool -f"
Paul Du Bois

4

Comme alternative, j'ai trouvé que objdumpcela fonctionnait bien. Par exemple, dans mon environnement, je construis des archives de bibliothèque avec vxWorks et je dois les lier à d'autres projets. Pour tester si l'archive est la bonne architecture, je pourrais faire quelque chose comme ce qui suit (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 exactement correct, car certaines lignes apparaissent qui ne disent pas elf32-sparc-vxworks, mais il est assez facile d'adapter cela.

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

edit Il m'est venu à l'esprit que l'OP demandait sur OSX. Mes excuses.


Pour l'utiliser, objdumpvous pouvez installer GNU Binutils via MacPorts. Pour voir toutes les architectures disponibles, exécutez simplement port search binutils. Les outils de développement natif sont préfixés pour éviter les conflits (par exemple gobjdumpau lieu de objdump). Vous pouvez créer un alias pour plus de commodité.
Stefan Schmidt

3

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.