¿Cómo determino la arquitectura de destino de la biblioteca estática (.a) en Mac OS X?

128

Estoy interesado en verificar si una biblioteca estática de iPhone se ha creado para ARM o Intel.

Es más curiosidad que otra cosa. ¿Hay algún tipo de herramienta específica de Mac OS X o BSD para hacer esto? Esta publicación da un ejemplo en Linux.

Justicle
fuente

Respuestas:

241

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

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
%
Václav Slavík
fuente
Acabo de verificar esto con un viejo archivo PJSIP .a. armv7. Gracias.
Alex Zavatone
69

fileprobablemente te lo diga. otoolciertamente debería poder hacerlo. Pero fileprimero lo intentaría , por ejemplo

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

Ejemplo con archivo:

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
fuente
34
En mi experiencia a filemenudo falla.
Stefan Schmidt
44
Vea la respuesta sobre lipo más abajo, siempre funciona.
Maciej Swic
Me he dado cuenta de que si el .a no está ranurado, el archivo a veces informa menos información.
Paul Du Bois
44
Ahora en 2015 deberías usar lipo. Vea la respuesta a continuación.
derFunk
1
Lamentablemente, esto no ha funcionado para varias versiones del sistema operativo.
rmcclellan
53

Como se mencionó anteriormente, fileno siempre funciona. otool -hv -arch alles probablemente lo más cercano a lo que se garantiza que funcione: proporciona información de arquitectura para cada archivo de objeto en la biblioteca.

Ejemplo:

% otool -hv /sw/lib/libfftw3.a
Archivo: /sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
Encabezado Mach
      magic cputype cpusubtype caps tipo de archivo ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 TODO 0x00 OBJETO 3 336 SUBSECCIONES_VIA_SÍMBOLOS
/sw/lib/libfftw3.a(alloc.o):
Encabezado Mach
      magic cputype cpusubtype caps tipo de archivo ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 TODOS 0x00 OBJETO 3 416 SUBSECCIONES_VIA_SÍMBOLOS
...
Jiahao Chen
fuente
Solo para agregar a esta respuesta, prefiero otool sobre archivo o lipo. Probé file, lipo y otool con una biblioteca de iOS fat y 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 es gruesa o no, debe usar "otool -arch all"; de lo contrario, informará solo una arquitectura por archivo .o. Para una descripción general rápida de las arquitecturas en su .a, "otool -f"
Paul Du Bois
4

Como alternativa, descubrí que objdumppuede funcionar bien. Como ejemplo, en mi entorno construyo archivos de biblioteca con vxWorks y necesito vincularlos a 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 correcto, porque aparecen algunas líneas que no dicen elf32-sparc-vxworks, pero es bastante fácil adaptar esto.

Un buen beneficio de esto es que objdump, o una variante con un nombre similar, está instalada en la mayoría de los sistemas operativos * nix, mientras que las herramientas sugeridas en otras respuestas no lo están.

editar Se me ocurrió que el OP estaba preguntando sobre OSX. Mis disculpas.

Brian Vandenberg
fuente
Para usar objdumppuede instalar GNU Binutils a través de MacPorts. Para ver todas las arquitecturas disponibles, simplemente ejecute port search binutils. Las herramientas para el desarrollo nativo tienen el prefijo para evitar conflictos (por ejemplo, en gobjdumplugar de objdump). Es posible que desee crear un alias por conveniencia.
Stefan Schmidt
3

Este script bash lo ayudará a obtener programáticamente una lista de arquitecturas en una variable.

list_archs.sh:

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

Ejemplo de uso:

./list_archs.sh /usr/lib/libc.dylib
x86_64 i386
bleater
fuente