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.

Author: Community, 2009-07-06

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
%
 206
Author: Václav Slavík,
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
 66
Author: Logan Capaldo,
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
...
 50
Author: Jiahao Chen,
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.

 4
Author: Brian Vandenberg,
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
 1
Author: bleater,
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