Antworten:
Eine andere Option ist lipo
; Die Ausgabe ist kurz und besser lesbar als otool
die.
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
werde es dir wahrscheinlich sagen. otool
sollte sicherlich in der Lage sein. Aber ich würde es file
zuerst 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
file
scheitert oft.
Wie bereits erwähnt, file
funktioniert nicht immer. otool -hv -arch all
ist wahrscheinlich das Nächste, was garantiert funktioniert - es liefert Architekturinformationen für jede einzelne Objektdatei in der Bibliothek.
Beispiel:
% otool -hv /sw/lib/libfftw3.a Archiv: /sw/lib/libfftw3.a /sw/lib/libfftw3.a(align.o): Mach Header magic cputype cpusubtype caps 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 Dateityp ncmds sizeofcmds flags MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 416 SUBSECTIONS_VIA_SYMBOLS ...
Als Alternative habe ich festgestellt, objdump
kann gut funktionieren. 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 angezeigt werden, die nicht elf32-sparc-vxworks sagen, 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 werden, dies nicht sind.
edit Mir ist gerade eingefallen, dass das OP unter OSX gefragt hat. Entschuldigen Sie.
objdump
Sie die GNU Binutils über MacPorts installieren. Um alle verfügbaren Architekturen zu sehen, führen Sie sie einfach aus port search binutils
. Den Tools für die native Entwicklung wird ein Präfix vorangestellt, um Konflikte zu vermeiden (z . B. gobjdump
anstelle von objdump
). Möglicherweise möchten Sie der Einfachheit halber einen Alias erstellen.
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