Risposte:
Un'altra opzione è lipo; il suo output è breve e più leggibile di quello otooldi.
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
%
fileprobabilmente te lo dirò. otoolsicuramente dovrebbe essere in grado di farlo. Ma fileprima 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
filespesso fallisce.
Come accennato in precedenza, filenon 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 objdumppuò 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.
objdumppuoi 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. gobjdumpAnziché 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