Wie bestimme ich die Zielarchitektur der statischen Bibliothek (.a) unter Mac OS X?

128

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 dafür ein Mac OS X- oder BSD-spezifisches Tool? Dieser Beitrag enthält ein Beispiel unter Linux.

Justicle
quelle

Antworten:

241

Eine andere Option ist lipo; Die Ausgabe ist kurz und besser lesbar als otooldie.

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
%
Václav Slavík
quelle
Ich habe dies gerade mit einer alten PJSIP .a-Datei überprüft. armv7. Vielen Dank.
Alex Zavatone
69

filewerde es dir wahrscheinlich sagen. otoolsollte sicherlich in der Lage sein. Aber ich würde es filezuerst 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
Logan Capaldo
quelle
34
Nach meiner Erfahrung filescheitert oft.
Stefan Schmidt
4
Siehe die Antwort über Lipo weiter unten, funktioniert immer.
Maciej Swic
Ich habe festgestellt, dass die Datei manchmal weniger Informationen enthält, wenn die .a-Datei nicht ranlib'd ist.
Paul Du Bois
4
Jetzt im Jahr 2015 sollten Sie Lipo verwenden. Siehe die Antwort unten.
derFunk
1
Leider hat dies bei mehreren Betriebssystemversionen nicht funktioniert.
Rmcclellan
53

Wie bereits erwähnt, filefunktioniert nicht immer. otool -hv -arch allist 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
...
Jiahao Chen
quelle
Um diese Antwort zu ergänzen, bevorzuge ich otool gegenüber file oder lipo. Ich habe Datei, Lipo und Otool mit einer iOS-Fettbibliothek ausprobiert und Otool war das einzige, das mir zeigte, dass es Dateien für i386 (iPhone Simulator) und für armv6, armv7 und armv7s (iPhone OS) enthielt.
Roberto
1
HINWEIS: Wenn Sie überprüfen möchten, ob Ihre Bibliothek fett ist oder nicht, möchten Sie "otool -arch all" verwenden. Andernfalls wird nur eine Architektur pro O-Datei gemeldet. Für einen schnellen Überblick über die Architekturen in Ihrer .a, "otool -f"
Paul Du Bois
4

Als Alternative habe ich festgestellt, objdumpkann 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 objdumpoder 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.

Brian Vandenberg
quelle
Zur Verwendung können objdumpSie 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. gobjdumpanstelle von objdump). Möglicherweise möchten Sie der Einfachheit halber einen Alias ​​erstellen.
Stefan Schmidt
3

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
Bleater
quelle