Mac OS X'te statik kitaplığın (.a) hedef mimarisini nasıl belirleyebilirim?


128

Belirli bir iPhone statik kitaplığının ARM veya Intel için oluşturulup oluşturulmadığını doğrulamakla ilgileniyorum.

Her şeyden çok merak. Bunu yapmak için bir tür Mac OS X veya BSD'ye özgü araç var mı? Bu gönderi Linux'ta bir örnek veriyor.

Yanıtlar:


241

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
%

Bunu eski bir PJSIP .a dosyasıyla doğruladım. ARMv7. Teşekkürler.
Alex Zavatone

69

filemuhtemelen sana söyleyecektir. otoolkesinlikle 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

34
Benim deneyimime göre fileçoğu zaman başarısız oluyor.
Stefan Schmidt

4
Lipo ile ilgili cevabı daha aşağıda görün, her zaman işe yarar.
Maciej Swic

Eğer .a ranlib'd değilse dosyanın bazen daha az bilgi rapor ettiğini fark ettim.
Paul Du Bois

4
Şimdi 2015 yılında lipo kullanmalısınız. Aşağıdaki cevaba bakın.
derFunk

1
Maalesef bu, birkaç işletim sistemi sürümünde işe yaramadı.
rmcclellan

53

Daha önce de belirtildiği gibi, fileher zaman işe yaramıyor.otool -hv -arch allmuhtemelen ç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
...

Sadece bu cevaba eklemek için otoolü file veya lipo yerine tercih ediyorum. File, lipo ve otool'u bir iOS yağ kitaplığı ile denedim ve otool, i386 (iPhone Simulator) ve armv6, armv7 ve armv7s (iPhone OS) için dosyalar içerdiğini gösteren tek şeydi.
Roberto

1
NOT: Kitaplığınızın şişman olup olmadığını kontrol etmek istiyorsanız, "otool -arch all" kullanmak istersiniz; aksi takdirde .o dosyası başına yalnızca bir mimari bildirir. .A'nızdaki mimarilere hızlı bir bakış için, "otool -f"
Paul Du Bois

4

Alternatif olarak, objdumpiyi ç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.


Kullanmak objdumpiç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, gobjdumpbunun yerine objdump). Kolaylık sağlamak için bir takma ad oluşturmak isteyebilirsiniz.
Stefan Schmidt

3

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.