Dalam LINUX tentukan apakah perpustakaan .a / arsip 32-bit atau 64-bit?

87

Kami mendistribusikan di Linux lib statis dalam versi 64-bit dan 32-bit. Saat memecahkan masalah pelanggan, saya ingin skrip shell diagnostik saya segera menghilangkan masalah dengan memeriksa file arsip .a untuk menentukan apakah itu 32 atau 64 bit. Metode yang menurut saya kurang elegan:

  1. ekstrak anggota .o dan tanyakan perintah "file" (misalnya, ELF 32-bit dll)

  2. mulai masukkan anggota dummy yang diberi kode untuk menunjukkan, misalnya 32bit.o / 64bit.o dan gunakan "ar -t" untuk memeriksa

Saya telah mencoba "string xyz.a | grep 32" tetapi ini tidak berfungsi dengan baik pada beberapa versi. Bukan masalah patah hati, tapi jika Anda tahu solusi yang elegan, saya ingin tahu.

cvsdave.dll
sumber
Saya tahu tentang stackoverflow.com/questions/184502/… , mencari solusi yang lebih baik.
cvsdave
2
Solusi dalam pertanyaan lain tampaknya menjawab masalah dengan cukup rapi, tetapi cara cepat adalah nm foo.a | grep '^ 0' | kepala -1 | wc -c - jika hasilnya 17 (16 + 1 == 8bytes + 1 char untuk line return), itu 64bit, jika 9 itu 32bit (8 + 1 == 4bytes + 1 char untuk line return)
Petesh
Bagaimana jika saya mendapatkan 14? o_0
Almo

Jawaban:

123

objdump sepertinya cara terbaik:

objdump -f libfoo.a | grep ^architecture
kafe
sumber
1
filelebih mudah dibaca seperti yang dinyatakan di bawah ini stackoverflow.com/a/8909086/233906
Cerber
1
Aku mengerti architecture: i386:x86-64, flags 0x00000039:.. apakah itu berarti keduanya ..? itu tidak mungkin. tolong bantu: D
graywolf
10
@Paladin: Itu 64 bit - arsitektur x86 dijelaskan oleh objdump sebagai i386(IA32 lama biasa), i386:x86-64(AMD64) dan i386:x64-32(arsitektur X32 32-bit-address-space-in-long-mode).
kafe
1
Bendera '-f' dalam 'objdump' menentukan untuk menampilkan isi dari keseluruhan file header perpustakaan 'libfoo.a'. Output dari 'objdump' ini kemudian disalurkan ke perintah grep yang mencari kata 'arsitektur'. Karakter '^' menandakan bahwa 'arsitektur' harus memulai baris.
Luke Purnell
3
Bersihkan dan hapus penipuan: objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u:)
legends2k
33

Cara termudah adalah dengan menggunakan perintah file.

$file <.so file or .a file>
pankaj kapoor
sumber
31
dalam lingkungan msys ini hanya echos <file>: arsip ar saat ini , bukan arsitektur target.
scone
11
Demikian juga di lingkungan Linux (Ubuntu) saya saat ini.
Asherah
4
juga di centos7
Chaim Geretz
Ini berfungsi dengan baik di Ubuntu 16.04. (1) file armeabi/libpique.so-> libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped. (2) file x86/libpique.so->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
rpattabi
5
File .so dan file .a bukanlah hal yang sama. Menunjukkan bahwa ini berfungsi untuk pustaka bersama tidak sama dengan menunjukkan bahwa ini berfungsi dengan pustaka statis. Pertanyaan asli adalah tentang pustaka statis (file .a). Dalam kasus saya (menggunakan MSYS) solusi objdump yang dikirim oleh caf bekerja di mana menggunakan file hanya mencetak 'arsip ar' sama seperti yang didapat scone.
Sean Burton
17

Cukup gunakan perintah file; yaitufile library.so

Erik
sumber
Pertanyaannya khusus untuk pustaka statis.
pooya13
3

Ups, sed yang hilang berarti itu ditampilkan ke banyak item.

Hanya sebagai jawaban:

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

Bagaimana itu seharusnya bekerja:

  • nm - dapatkan simbol dari perpustakaan
  • grep - dapatkan baris yang dimulai dengan string hex (alamat simbol dalam file)
  • kepala - dapatkan baris pertama
  • sed - menghapus semua yang melewati spasi, termasuk spasi
  • wc - hitung jumlah karakter.

Dalam lingkungan 32 bit, Anda mendapatkan alamat yang terdiri dari 8 digit hex, menambahkan baris baru memberi Anda 9, Dalam lingkungan 64bit, Anda mendapatkan alamat yang terdiri dari 16 digit hex, menambahkan baris baru memberi Anda 17.

Petesh
sumber
1
Mungkin ingin melempar sed -e 's /. * //' di sana
kowey
Omong-omong, saya mendapatkan 73. Mau menjelaskan mengapa itu harus berhasil?
Francesco Dondi
Ups, sed yang hilang itu penting. Jawaban diperbarui, dengan penjelasan tentang cara kerjanya
Petesh
1

Jika ada fungsi yang khusus untuk versi tertentu Anda dapat mencoba nm kemudian grep untuk fungsi tersebut.

ColWhi
sumber
Anda mungkin dapat menulis beberapa kode yang mencari byte tertentu di perpustakaan. Anda dapat mencoba menggunakan od pada kedua file dan menemukan perbedaan di antara keduanya.
ColWhi
1
Solusi lain adalah mengganti nama perpustakaan.
ColWhi