LINUX'ta bir .a kitaplık / arşivin 32 bit mi yoksa 64 bit mi olduğunu belirleyin.


87

Linux'ta hem 64-bit hem de 32-bit sürümlerde statik bir kitaplık dağıtıyoruz. Bir müşteride sorun giderirken, tanılama kabuğu komut dosyamın sorunu hızlı bir şekilde ortadan kaldırmasını istiyorum. Aklıma gelen yöntemler zarif olmaktan çok daha az:

  1. bir .o üyesini çıkarın ve "dosya" komutunu sorun (ör. ELF 32 bit vb.)

  2. Örneğin 32bit.o / 64bit.o gibi kodlanmış bir sahte üye dahil etmeye başlayın ve kontrol etmek için "ar -t" kullanın

"Strings xyz.a | grep 32" denedim ama bu sürümler üzerinde pek işe yaramıyor. Kalp kırıcı bir sorun değil, ama zarif bir çözüm biliyorsanız, bilmek isterim.


Stackoverflow.com/questions/184502/… hakkında daha iyi bir çözüm arayan biliyorum .
cvsdave

2
Diğer sorudaki çözüm, sorunu oldukça düzgün bir şekilde ele alıyor gibi görünüyor, ancak hızlı bir yol nm foo.a | grep '^ 0' | kafa -1 | wc -c - sonuç 17 ise (16 + 1 == 8 bayt + satır dönüşü için 1 karakter), 64 bit, 9 ise 32 bit (8 + 1 == 4 bayt + satır dönüşü için 1 karakter)
Petesh

Ya 14 alırsam? o_0
Almo

Yanıtlar:


123

objdump en iyi yol gibi görünüyor:

objdump -f libfoo.a | grep ^architecture

1
fileaşağıda belirtildiği gibi okunması daha kolaydır stackoverflow.com/a/8909086/233906
Cerber

1
Anlıyorum architecture: i386:x86-64, flags 0x00000039:.. bu ikisinin de olduğu anlamına mı geliyor ..? bu pek olası değil. lütfen yardım edin: D
graywolf

10
@Paladin: Bu 64 bit - x86 mimarileri objdump tarafından i386(düz eski IA32), i386:x86-64(AMD64) ve i386:x64-32(uzun modda X32 32 bit adres alanı mimarisi) olarak tanımlanıyor.
caf

1
'Objdump' içindeki '-f' bayrağı 'libfoo.a' kitaplığının genel dosya başlığının içeriğini göstermeyi belirtir. Bu 'objdump' çıktısı daha sonra 'mimari' kelimesini arayan grep komutuna aktarılır. '^' Karakteri, 'mimarinin' satıra başlaması gerektiğini belirtir.
Luke Purnell

3
Temizleyin ve objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u
çiftleri

33

En basit yol, dosya komutunu kullanmaktır.

$file <.so file or .a file>

31
msys ortamında bu sadece <file>: mevcut ar arşivini yankılar , hedef mimariyi değil.
çörekler

11
Aynı şekilde mevcut Linux (Ubuntu) ortamımda.
Aşera

4
aynı şekilde centos7
Chaim Geretz

Ubuntu 16.04'te iyi çalışıyor. (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
Bir .so dosyası ve bir .a dosyası aynı şey değildir. Bunun paylaşılan bir kitaplık için çalıştığını göstermek, statik bir kitaplıkla çalıştığını göstermekle aynı şey değildir. Asıl soru statik bir kitaplık (.a dosyası) hakkındadır. Benim durumumda (MSYS kullanarak) caf tarafından yayınlanan objdump çözümü, dosya kullanımının sadece "ar arşivini" scones ile aynı şekilde yazdırdığı yerde çalışır.
Sean Burton

17

Sadece dosya komutunu kullanın; yanifile library.so


Soru özellikle statik kitaplıklar içindir.
pooya13

3

oops, bu eksik sed, birçok öğede görüntülendiği anlamına geliyor.

Sadece bir cevap olarak:

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

Nasıl çalışması gerekiyor:

  • nm - sembolleri kütüphaneden alın
  • grep - bir onaltılık dizeyle başlayan satırları bul (dosyadaki sembolün adresi)
  • head - ilk satırı al
  • sed - boşluk dahil olmak üzere beyaz boşluktan sonraki her şeyi kaldır
  • wc - karakter sayısını sayın.

32 bitlik bir ortamda 8 hex basamaktan oluşan adresler alırsınız, yeni satır eklemek size verir 9, 64bit ortamda 16 hex basamaktan oluşan adresler alırsınız, yeni satır eklemek size verir 17.


1
Oraya bir sed -e 's /. * //' atmak isteyebilirsiniz
kowey

Bu arada 73 aldım. Neden çalışması gerektiğini açıklamak ister misiniz?
Francesco Dondi

oops, eksik sed önemliydi. Cevap, nasıl çalışması gerektiğine dair bir açıklama ile güncellendi
Petesh

1

Belirli bir sürüme özgü işlevler varsa nm'yi deneyebilirsiniz ve işlev için grep'i deneyebilirsiniz.


Kitaplıkta belirli baytları arayan bazı kodlar yazabilirsiniz. Her iki dosyada od kullanmayı ve ikisi arasındaki farkları bulmayı deneyebilirsiniz.
ColWhi

1
Başka bir çözüm de kitaplıkları yeniden adlandırmak olabilir.
ColWhi
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.