iphone - usa - ¿Cómo determino la arquitectura de destino de la biblioteca estática(.a) en Mac OS X?
macbook pro (5)
Estoy interesado en verificar si se ha creado una biblioteca estática de iPhone para ARM o Intel.
Es más curiosidad que nada. ¿Hay algún tipo de herramienta específica Mac OS X o BSD para hacer esto? Esta post da un ejemplo en Linux.
Como alternativa, he encontrado que 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 precisamente correcto, porque algunas líneas 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, está instalada en la mayoría de los sistemas operativos * nix, mientras que las herramientas sugeridas en otras respuestas no lo son.
editar Simplemente se me ocurrió que el OP preguntaba por OSX. Mis disculpas.
Como se mencionó anteriormente, el file
no siempre funciona. otool -hv -arch all
es probablemente lo más cercano 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 ...
Este script bash te 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
file
probablemente te diga sin otool
, el otool
debería ser capaz de hacerlo. Pero trataría de file
primero, 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
Otra opción es lipo
; su salida es breve y más legible que las de 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
%