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.

Justicle
la source

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
%
Václav Slavík
la source
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
Logan Capaldo
la source
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
...
Jiahao Chen
la source
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.

Brian Vandenberg
la source
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
bleater
la source