Bagaimana cara menentukan arsitektur target perpustakaan statis (.a) di Mac OS X?

128

Saya tertarik untuk memverifikasi apakah perpustakaan statis iPhone yang diberikan telah dibangun untuk ARM atau Intel.

Ini lebih dari rasa ingin tahu. Apakah ada semacam alat khusus Mac OS X atau BSD untuk melakukan ini? Posting ini memberi contoh di Linux.

Justicle
sumber

Jawaban:

241

Pilihan lain adalah lipo; outputnya singkat dan lebih mudah dibaca daripada otool.

Sebuah contoh:

% 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
sumber
Baru saja memverifikasi ini dengan file .a PJSIP lama. armv7. Terima kasih.
Alex Zavatone
69

filemungkin akan memberitahumu. otooltentunya harus bisa. Tapi saya akan coba filedulu, mis

logan:/Users/logan% file d2
d2: Mach-O executable ppc

Contoh dengan arsip:

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
sumber
34
Dalam pengalaman saya filesering gagal.
Stefan Schmidt
4
Lihat jawaban tentang lipo lebih jauh ke bawah, selalu berhasil.
Maciej Swic
Saya perhatikan bahwa jika .a tidak dijalankan, file terkadang melaporkan lebih sedikit informasi.
Paul Du Bois
4
Sekarang di 2015 Anda harus menggunakan lipo. Lihat jawabannya di bawah.
derFunk
1
Sayangnya ini tidak berfungsi untuk beberapa versi OS.
rmcclellan
53

Seperti disebutkan sebelumnya, filetidak selalu berhasil. otool -hv -arch allmungkin adalah hal terdekat yang dijamin berfungsi - ini memberikan informasi arsitektur untuk setiap file objek tunggal di perpustakaan.

Contoh:

% otool -hv /sw/lib/libfftw3.a
Arsip: /sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
Tajuk mach
      magic cputype cpusubtype membatasi filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 336 SUBSECTIONS_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o):
Tajuk mach
      magic cputype cpusubtype membatasi filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 416 SUBSECTIONS_VIA_SYMBOLS
...
Jiahao Chen
sumber
Hanya untuk menambah jawaban ini, saya lebih suka otool daripada file atau lipo. Saya mencoba file, lipo dan otool dengan pustaka iOS iOS dan otool adalah satu-satunya yang menunjukkan kepada saya bahwa itu berisi file untuk i386 (iPhone Simulator) dan untuk armv6, armv7 dan armv7s (iPhone OS).
Roberto
1
CATATAN: jika Anda ingin memeriksa apakah perpustakaan Anda gemuk atau tidak, Anda ingin menggunakan "otool -arch all"; jika tidak, itu akan melaporkan hanya satu arsitektur per file .o. Untuk tinjauan singkat tentang arsitektur di .a Anda, "otool -f"
Paul Du Bois
4

Sebagai alternatif, saya temukan objdumpbisa bekerja dengan baik. Sebagai contoh, di lingkungan saya, saya membangun arsip perpustakaan dengan vxWorks dan perlu menghubungkannya dengan proyek lain. Untuk menguji apakah arsipnya adalah arsitektur yang benar, saya dapat melakukan sesuatu seperti berikut (sintaks bash):

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;

Contoh ini tidak tepat benar, karena beberapa baris DO muncul yang tidak mengatakan elf32-sparc-vxworks, tetapi cukup mudah untuk mengadaptasi ini.

Satu manfaat yang bagus dari hal ini adalah bahwa objdump, atau varian yang bernama serupa, diinstal pada kebanyakan sistem operasi * nix, sedangkan alat yang disarankan dalam respons lain tidak.

sunting Terjadi pada saya OP bertanya pada OSX. Permintaan maaf saya.

Brian Vandenberg
sumber
Untuk menggunakan objdumpAnda dapat menginstal Binutils GNU melalui MacPorts. Untuk melihat semua arsitektur yang tersedia, jalankan saja port search binutils. Alat untuk pengembangan asli diawali untuk menghindari konflik (misalnya, gobjdumpbukan objdump). Anda mungkin ingin membuat alias untuk kenyamanan.
Stefan Schmidt
3

Skrip bash ini akan membantu Anda secara pemrograman mendapatkan daftar arsitektur ke dalam variabel.

list_archs.sh:

#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'

Contoh penggunaan:

./list_archs.sh /usr/lib/libc.dylib
x86_64 i386
pemutih
sumber