Yanıtlar:
Diğer bir seçenek ise lipo
; çıktısı kısa vekinden daha okunaklı otool
.
Bir örnek:
% 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
muhtemelen sana söyleyecektir. otool
kesinlikle yapabilmelidir. Ama önce denerdim file
, örneğin
logan:/Users/logan% file d2
d2: Mach-O executable ppc
Arşiv örneği:
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
çoğu zaman başarısız oluyor.
Daha önce de belirtildiği gibi, file
her zaman işe yaramıyor.otool -hv -arch all
muhtemelen çalışması garanti edilen en yakın şeydir - kütüphanedeki her bir nesne dosyası için mimari bilgisi verir.
Misal:
% otool -hv /sw/lib/libfftw3.a Arşiv: /sw/lib/libfftw3.a /sw/lib/libfftw3.a(align.o): Mach başlığı sihirli cputype cpusubtype caps dosya türü ncmds sizeofcmds bayrakları MH_MAGIC_64 X86_64 TÜM 0x00 NESNE 3336 ALT BÖLÜMLER_VIA_SYMBOLS /sw/lib/libfftw3.a(alloc.o): Mach başlığı sihirli cputype cpusubtype caps dosya türü ncmds sizeofcmds bayrakları MH_MAGIC_64 X86_64 TÜM 0x00 NESNE 3416 ALT BÖLÜMLER_VIA_SYMBOLS ...
Alternatif olarak, objdump
iyi çalışabileceğini buldum . Örnek olarak, ortamımda vxWorks ile kütüphane arşivleri oluşturuyorum ve bunları diğer projelere bağlamam gerekiyor. Arşivin doğru mimari olup olmadığını test etmek için aşağıdaki gibi bir şey yapabilirim (bash sözdizimi):
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;
Bu örnek tam olarak doğru değildir, çünkü elf32-sparc-vxworks demeyen bazı satırlar ortaya çıkmaktadır, ancak bunu adapte etmek yeterince kolaydır.
Bunun güzel bir yararı objdump
, veya benzer şekilde adlandırılmış bir varyantın çoğu * nix işletim sisteminde yüklü olmasıdır, oysa diğer yanıtlarda önerilen araçlar değildir.
düzenleme OP'nin OSX'te sorduğu aklıma geldi. Özür dilerim.
objdump
için GNU Binutils'i MacPorts aracılığıyla kurabilirsiniz. Mevcut tüm mimarileri görmek için sadece çalıştırın port search binutils
. Yerel geliştirme araçları, çatışmaları önlemek için ön eklidir (örneğin, gobjdump
bunun yerine objdump
). Kolaylık sağlamak için bir takma ad oluşturmak isteyebilirsiniz.
Bu bash betiği, programlı olarak bir mimariler listesini bir değişkene almanıza yardımcı olacaktır.
list_archs.sh:
#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'
Kullanım örneği:
./list_archs.sh /usr/lib/libc.dylib
x86_64 i386