Come posso determinare l'architettura di destinazione della libreria statica (.a) su Mac OS X?


128

Sono interessato a verificare se una determinata libreria statica di iPhone è stata creata per ARM o Intel.

È più curiosità di ogni altra cosa. Esiste un tipo di strumento specifico per Mac OS X o BSD per farlo? Questo post fornisce un esempio in Linux.

Risposte:


241

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
%

Ho appena verificato questo con un vecchio file .a PJSIP. ARMv7. Grazie.
Alex Zavatone,

69

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

34
Nella mia esperienza filespesso fallisce.
Stefan Schmidt,

4
Vedi la risposta su lipo più in basso, funziona sempre.
Maciej Swic,

Ho notato che se il file .a non è ranlib, a volte il file riporta meno informazioni.
Paul Du Bois,

4
Ora nel 2015 dovresti usare lipo. Vedi la risposta sotto.
derFunk,

1
Purtroppo questo non ha funzionato per diverse versioni del sistema operativo.
rmcclellan,

53

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
...

Solo per aggiungere a questa risposta, preferisco otool su file o lipo. Ho provato file, lipo e otool con una libreria di grassi iOS e otool è stato l'unico che mi ha mostrato che conteneva file per i386 (iPhone Simulator) e per armv6, armv7 e armv7s (iPhone OS).
Roberto

1
NOTA: se vuoi controllare se la tua libreria è grassa o no, vuoi usare "otool -arch all"; in caso contrario, riporterà solo un'architettura per file .o. Per una rapida panoramica delle architetture nel tuo .a, "otool -f"
Paul Du Bois,

4

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.


Per usare 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à.
Stefan Schmidt,

3

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.