it-swarm.com.de

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

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.

118
Justicle

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
%
230
Václav Slavík

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
66
Logan Capaldo

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 
 ... 
53
Jiahao Chen

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.

4

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
3
bleater