2009-07-06 12 views

Respuesta

200

Otra opción es lipo; su salida es breve y más legible que otool.

Un ejemplo:

% 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 
% 
+0

Solo lo verifiqué con un antiguo archivo .a PJSIP. armv7. Gracias. –

66

file probablemente le diga. otool ciertamente debería ser capaz de hacerlo. Pero probaría file primero, p.

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

Ejemplo de archivo:

+28

En mi experiencia 'file' a menudo falla. –

+4

Ver la respuesta sobre lipo más abajo, siempre funciona. –

+0

otool works, lipo works, el archivo no funcionó para mí –

49

Como se mencionó anteriormente, file no siempre funciona. otool -hv -arch all es probablemente lo más parecido que se garantiza que funciona: proporciona información de arquitectura para cada archivo de objeto individual en la biblioteca.

Ejemplo:

% otool -hv /sw/lib/libfftw3.a 
Archive : /sw/lib/libfftw3.a 
/sw/lib/libfftw3.a(align.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
MH_MAGIC_64 X86_64  ALL 0x00  OBJECT  3  336 SUBSECTIONS_VIA_SYMBOLS 
/sw/lib/libfftw3.a(alloc.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
MH_MAGIC_64 X86_64  ALL 0x00  OBJECT  3  416 SUBSECTIONS_VIA_SYMBOLS 
... 
+0

Solo para agregar a esta respuesta, prefiero el otool sobre archivo o lipo.Intenté file, lipo y otool con una biblioteca de iOS fat y el otool fue el único que me mostró que contenía archivos para i386 (iPhone Simulator) y para armv6, armv7 y armv7s (iPhone OS). – Roberto

+1

NOTA: si desea verificar si su biblioteca está gruesa o no, debe usar "otool -arch all"; de lo contrario, informará solo una arquitectura por archivo .o. Para obtener una visión general rápida de las arquitecturas en su .a, "otool -f" –

3

Como alternativa, he encontrado objdump puede funcionar bien. Como ejemplo, en mi entorno construyo archivos de biblioteca con vxWorks y necesito vincularlos con otros proyectos. Para probar si el archivo es la arquitectura correcta, podría hacer algo como lo siguiente (sintaxis 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; 

Este ejemplo no es exactamente correcta, debido a que algunas líneas no aparecen que no dicen elf32- sparc-vxworks, pero es bastante fácil adaptar esto.

Una buena ventaja de esto es que objdump, o una variante de nombre similar, se instala en la mayoría de los sistemas operativos * nix, mientras que las herramientas sugeridas en otras respuestas no lo son.

edit Se me acaba de ocurrir que el OP preguntaba por OSX. Mis disculpas.

+0

Para usar 'objdump' puede instalar GNU Binutils a través de MacPorts. Para ver todas las arquitecturas disponibles simplemente ejecuta 'port search binutils'. Las herramientas para el desarrollo nativo están prefijadas para evitar conflictos (por ejemplo, 'gobjdump' en lugar de' objdump'). Es posible que desee crear un alias para mayor comodidad. –

+0

downvoter: ¿te importaría hablar con un comentario constructivo? –

1

Este script bash te ayudará a obtener una lista de arquitecturas en una variable mediante programación.

list_archs.sh: ejemplo

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

Uso:

./list_archs.sh /usr/lib/libc.dylib 
x86_64 i386 
Cuestiones relacionadas