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

Estoy interesado en verificar si un determinado iPhone biblioteca estática ha sido construido para ARM o Intel.

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

InformationsquelleAutor Justicle | 2009-07-06

5 Kommentare

  1. 235

    Otra opción es lipo; su salida es breve y más fácil de leer 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
    %
    • Sólo verificó con un viejo PJSIP .un archivo. armv7. Gracias.
  2. 67

    file probablemente le dirá usted. otool sin duda debe ser capaz de. Pero me gustaría probar file en primer lugar,
    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
    • En mi experiencia file a menudo falla.
    • Véase la respuesta acerca de la lipo más abajo, siempre funciona.
    • otool obras, lipo funciona, el archivo no funciona para mí
    • Me he dado cuenta de que si la .una es no es ranlib d, de archivo, a veces, los informes de menos información.
    • Ahora, en el 2015, usted debe usar lipo. Véase la respuesta a continuación.
    • Por desgracia esto no ha trabajado para varias versiones del sistema operativo.

  3. 53

    Como se mencionó anteriormente, file no siempre funciona. otool -hv -arch all es probablemente la cosa más cercana que está garantizado para trabajar – le da a la arquitectura de la información de cada archivo de objeto en la biblioteca.

    Ejemplo:

    % otool -hv /sw/lib/libfftw3.un 
    Archivo : /sw/lib/libfftw3.un 
    /sw/lib/libfftw3.un(a alinear.o): 
    Mach encabezado 
    la magia cputype cpusubtype tapas tipo de archivo ncmds sizeofcmds banderas 
    MH_MAGIC_64 X86_64 TODOS 0x00 OBJETO 3 336 SUBSECTIONS_VIA_SYMBOLS 
    /sw/lib/libfftw3.un(alloc.o): 
    Mach encabezado 
    la magia cputype cpusubtype tapas tipo de archivo ncmds sizeofcmds banderas 
    MH_MAGIC_64 X86_64 TODOS 0x00 OBJETO 3 416 SUBSECTIONS_VIA_SYMBOLS 
    ... 
    
    • Sólo para agregar a esta respuesta, yo prefiero otool sobre el archivo o lipo. Traté de archivo, lipo y otool con una versión de iOS de la grasa de la biblioteca y otool fue el único que me mostró que contenía los archivos para i386 (iPhone Simulator) y para los binarios armv6, armv7 y armv7s (iPhone OS).
    • NOTA: si desea comprobar si la biblioteca es grasa o no, que desee utilizar «otool -arco de todos»; de lo contrario, se informará sólo una arquitectura por .o archivo. Para una visión rápida de las arquitecturas en su .una, «otool -f»
  4. 4

    Como una alternativa, he encontrado objdump puede funcionar bien. Como un ejemplo, en mi entorno puedo construir archivos de la biblioteca con vxWorks y la necesidad de vincular a aquellos en otros proyectos. Para probar si el archivo es la arquitectura correcta, yo podría hacer algo como lo siguiente (la sintaxis de 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 algunas de las líneas que se muestran hasta que no dicen elf32-sparc-vxworks, pero es bastante fácil de adaptar este.

    Una buena ventaja de esto es que objdump, o un nombre similar variante, está instalado en la mayoría de los *nix sistemas operativos, mientras que las herramientas que se sugieren en otras respuestas no están.

    editar Se me acaba de ocurrir que el OP estaba preguntando en OSX. Mis disculpas.

    • El uso de objdump puede instalar el GNU Binutils a través de MacPorts. Para ver todas las disponibles arquitecturas de ejecutar los port search binutils. Las herramientas para el desarrollo nativo se prefijan para evitar conflictos (por ejemplo, gobjdump en lugar de objdump). Es posible que desee crear un alias para su comodidad.
  5. 3

    Este script de bash que 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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea