137 votes

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

Je suis intéressé à vérifier si un iPhone statique de la bibliothèque a été construite pour ARM ou Intel.

C'est plus de la curiosité qu'autre chose. Est-il une sorte de Mac OS X, BSD ou outil spécifique pour ce faire? Ce post donne un exemple dans Linux.

258voto

Václav Slavík Points 1907

Une autre option est - lipo; sa sortie est brève et plus lisible qu' 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
%

71voto

Logan Capaldo Points 22145

file vont probablement vous dire. otool devrait certainement être en mesure de. Mais j'essaierais filepremière, par exemple

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

Exemple avec l'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

54voto

AcidFlask Points 571

Comme mentionné précédemment, file ne fonctionne pas toujours. otool -hv -arch all est probablement la chose la plus proche qui est garanti pour fonctionner - il donne des informations sur l'architecture de chaque fichier de l'objet dans la bibliothèque.

Exemple:

% otool -hv /sw/lib/libfftw3.un
Archives : /sw/lib/libfftw3.un
/sw/lib/libfftw3.un(aligner.o):
Mach-tête
 la magie cputype cpusubtype casquettes filetype ncmds sizeofcmds drapeaux
MH_MAGIC_64 X86_64 TOUS 0x00 OBJET 3 336 SUBSECTIONS_VIA_SYMBOLS
/sw/lib/libfftw3.un(alloc.o):
Mach-tête
 la magie cputype cpusubtype casquettes filetype ncmds sizeofcmds drapeaux
MH_MAGIC_64 X86_64 TOUS 0x00 OBJET 3 416 SUBSECTIONS_VIA_SYMBOLS
...

4voto

Brian Vandenberg Points 1042

Comme une alternative, j'ai trouvé objdump peut bien fonctionner. Comme un exemple, dans mon environnement, je construis des archives de la bibliothèque avec vxWorks et de la nécessité de lier ceux dans d'autres projets. Pour tester si l'archive est de la bonne architecture, je pourrais faire quelque chose comme ce qui suit (bash syntaxe):

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 précisément correct, parce que certaines lignes NE présentent que de ne pas dire elf32-sparc-vxworks, mais il est assez facile de s'adapter.

Un avantage de cela est qu' objdump, ou un même nom que la variante, est installé sur la plupart des *nix systèmes d'exploitation, tandis que les outils proposés dans les autres réponses ne le sont pas.

edit Il vient de se produire pour moi l'OP demande sur OSX. Toutes mes excuses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X