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.
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.
Respuestas:
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
%
file
probablemente te lo diga. otool
ciertamente debería poder hacerlo. Pero file
primero 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
file
menudo falla.
Como se mencionó anteriormente, file
no siempre funciona. otool -hv -arch all
es 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 ...
Como alternativa, descubrí que objdump
puede 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.
objdump
puede 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 gobjdump
lugar de objdump
). Es posible que desee crear un alias por conveniencia.
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