Ich möchte überprüfen, ob eine bestimmte statische iPhone-Bibliothek für ARM oder Intel erstellt wurde.
Es ist mehr Neugier als alles andere. Gibt es eine Art Mac OS X- oder BSD-spezifisches Tool, um dies zu tun? Diese post gibt ein Beispiel in Linux.
Eine andere Option ist lipo
; Die Ausgabe ist kurz und besser lesbar als die von otool
.
Ein Beispiel:
% 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
wird es Ihnen wahrscheinlich sagen. otool
sollte das sicherlich können. Aber ich würde zuerst file
versuchen, z.
logan:/Users/logan% file d2
d2: Mach-O executable ppc
Beispiel mit Archiv:
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
Wie bereits erwähnt, funktioniert file
nicht immer. otool -hv -Arch all
ist wahrscheinlich die am nächsten liegende Funktion, die garantiert funktioniert. Sie gibt Architekturinformationen für jede einzelne Objektdatei in der Bibliothek an.
Beispiel:
% otool -hv /sw/lib/libfftw3.a[.____. Mach-Header Magic cputype cpusubtype begrenzt den Dateityp 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 ...
Als Alternative habe ich festgestellt, dass objdump
gut funktionieren kann. In meiner Umgebung erstelle ich beispielsweise Bibliotheksarchive mit vxWorks und muss diese mit anderen Projekten verknüpfen. Um zu testen, ob das Archiv die richtige Architektur hat, könnte ich Folgendes tun (Bash-Syntax):
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;
Dieses Beispiel ist nicht genau richtig, da einige Zeilen auftauchen, die nicht elf32-sparc-vxworks enthalten, aber es ist einfach genug, dies anzupassen.
Ein netter Vorteil davon ist, dass objdump
oder eine ähnlich benannte Variante auf den meisten * nix-Betriebssystemen installiert ist, während Tools, die in anderen Antworten vorgeschlagen wurden, dies nicht tun.
edit Mir ist gerade eingefallen, dass das OP unter OSX gefragt hat. Entschuldigen Sie.
Mit diesem Bash-Skript können Sie programmgesteuert eine Liste von Architekturen in eine Variable umwandeln.
list_archs.sh:
#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'
Anwendungsbeispiel:
./list_archs.sh /usr/lib/libc.dylib
x86_64 i386