Cómo determino la arquitectura de destino de static library (.a) en Mac OS X?
Estoy interesado en verificar si una determinada biblioteca estática de iPhone se ha construido para ARM o Intel.
Es más curiosidad que nada. ¿Hay algún tipo de herramienta específica de Mac OS X o BSD para hacer esto? Este post da un ejemplo en Linux.
5 answers
Otra opción es lipo
; su salida es breve y más legible que 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
%
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-02 02:20:30
file
probablemente te lo diga. otool
ciertamente debería ser capaz de hacerlo. Pero yo intentaría 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-06 02:23:44
Como se mencionó anteriormente, file
no siempre funciona. otool -hv -arch all
es probablemente lo más cercano que se garantiza que funcione: proporciona información de arquitectura para cada archivo objeto de 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 ...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-02 02:23:55
Como alternativa, he encontrado 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 precisamente correcto, porque aparecen algunas líneas que no dicen elf32-sparc-vxworks, pero es bastante fácil adaptarlo.
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.
edit Se me acaba de ocurrir que la OP estaba preguntando en OSX. Mis disculpas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-18 17:09:09
Este script bash le ayudará a obtener mediante programación 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 22:04:20