Risposte:
Un'altra opzione è lipo
; il suo output è breve e più leggibile di quello otool
di.
Un esempio:
% 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
probabilmente te lo dirò. otool
sicuramente dovrebbe essere in grado di farlo. Ma file
prima proverei , ad es
logan:/Users/logan% file d2
d2: Mach-O executable ppc
Esempio con archivio:
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
spesso fallisce.
Come accennato in precedenza, file
non sempre funziona. otool -hv -arch all
è probabilmente la cosa più vicina a cui è garantito il funzionamento: fornisce informazioni sull'architettura per ogni singolo file oggetto nella libreria.
Esempio:
% otool -hv /sw/lib/libfftw3.a Archivio: /sw/lib/libfftw3.a /sw/lib/libfftw3.a(align.o): Intestazione Mach 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): Intestazione Mach Magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 TUTTI 0x00 OGGETTO 3 416 SUBSECTIONS_VIA_SYMBOLS ...
In alternativa, ho scoperto che objdump
può funzionare bene. Ad esempio, nel mio ambiente ho creato archivi di librerie con vxWorks e ho bisogno di collegarli ad altri progetti. Per verificare se l'archivio è l'architettura corretta, potrei fare qualcosa di simile al seguente (sintassi 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;
Questo esempio non è esattamente corretto, perché compaiono alcune linee che non dicono elf32-sparc-vxworks, ma è abbastanza facile adattarlo.
Un bel vantaggio di questo è che objdump
, o una variante con nome simile, è installato sulla maggior parte dei sistemi operativi * nix, mentre gli strumenti suggeriti in altre risposte non lo sono.
modifica Mi è appena venuto in mente che l'OP chiedeva su OSX. Mie scuse.
objdump
puoi installare GNU Binutils tramite MacPorts. Per vedere tutte le architetture disponibili basta eseguire port search binutils
. Gli strumenti per lo sviluppo nativo hanno il prefisso per evitare conflitti (ad es. gobjdump
Anziché objdump
). Potresti voler creare un alias per comodità.
Questo script bash ti aiuterà a ottenere a livello di codice un elenco di architetture in una variabile.
list_archs.sh:
#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'
Esempio di utilizzo:
./list_archs.sh /usr/lib/libc.dylib
x86_64 i386