Linux ikili dosyasının 32 bit mi yoksa 64 bit mi olduğunu nasıl belirleyebilirim?


24

32 bit çekirdek (x86) yalnızca 32 bit kodu çalıştırabilir. 64 bit çekirdek (x86_64) hem 32 bit hem de 64 bit kodu çalıştırabilir.

Bir makinenin yürütülebilir çalıştırıp çalıştıramayacağını bilmek istiyorum: Başka bir deyişle, bir ikili dosyam var ve 32-bit Ubuntu üzerinde çalıştırmam gerekiyor, ancak ikili dosyanın 32-bit yürütülebilir olup olmadığını bilmiyorum .

fileKontrol edilecek yürütülebilir dosyayı belirterek komutu kullandım ve bu döndürülen sonuç oldu:

ELF 64 bit LSB yürütülebilir, x86-64, sürüm 1 (SYSV), GNU / Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07 için, soyulmamış

Yanıtlar:


29

Başlıktaki sorunun cevabı, çıktının başında yer almaktadır:

ELF 64 bit LSB yürütülebilir, x86-64

ELF, Linux tarafından en sık kullanılan ikili yürütülebilir dosya biçimi olan Yürütülebilir ve Bağlanabilir Biçimdir .

x86-64, orijinal olarak AMD tarafından tanıtılan x86 komutunun 64-bit sürümü olan ikili mimaridir . Benden öte nedenlerden ötürü Microsoft buna "x64" deniyor, ama aynı şey.

Çekirdeğin mimarisini bilmeniz gerekiyorsa kullanabilirsiniz uname -mpi. Örneğin, benim sistemimde:

x86_64 bilinmiyor bilinmiyor

yani x86-64 çekirdeği çalıştırıyorum.

CPU'nun kendisi ile ilgileniyorsanız /proc/cpuinfo, Linux çekirdeği tarafından algılanan CPU (lar) hakkında ayrıntılara bakın .

32 bit 80x86 yürütülebilir dosyası şu şekilde tanımlanır file:

ELF 32 bit LSB yürütülebilir, Intel 80386 , sürüm 1 (SYSV), dinamik olarak bağlı (paylaşılan kütüphaneleri kullanır), GNU / Linux 2.6.8 için, soyulmuş

bu bize bunun Intel 80386 komut setini (muhtemelen uzantılarla birlikte) kullanarak 32 bit yürütülebilir olduğunu söyler.

32 bit ve 64 bit mimariler kadar basit olmadığını unutmayın. Örneğin, Linux çekirdeği Intel 80386, AVR32 , S / 390 ve Unicore32 gibi 32 bit mimarileri destekler . 64-bit tarafında, Linux PA-RISC , x86-64, Itanium ve Alpha'da kullanılabilir . Bununla birlikte, tüm dağıtımlar tüm mimariler için ikili dosyalar sağlamaz (ve desteklenen tüm CPU mimarilerini eşit olarak hedefleyen herhangi bir dağıtım olduğundan şüpheliyim ). Bu nedenle, belirli bir binary'nin belirli bir sistemde çalıştırılabilir olup olmayacağını bilmek istiyorsanız , CPU'nun yerel kelime boyutu yerine mimariyi dikkate almanız gerekir .


1
"benden öte nedenler". Hala x64'ün 64 bit ve x86'nın 32 bit olduğunu öğrendiğim günü hatırlıyorum.
Paul Draper

1
@PaulDraper "x86" terimi açık bir etimolojiye sahiptir; 8008 veya 8080 gibi öncekilerden farklılaşan Intel'in 80x86 serisi CPU'larına dayanıyor ve bu günlerde çoğunlukla 32 bit (IA-32 komut seti) özellikli varyantlara (80386, 80486, Pentium ve daha yeni) atıfta bulunuyor ). Bu daha yeni model numaraları genellikle başlangıçta "80" çıkartılarak kısaltılmıştır, bu nedenle (ima edilen 32 bit) x86 386, 486 vb. İle eşleşir. Ancak, model numarası olan 64 bit CPU'ların farkında değilim "64" ile biten benzer bir yapı; kesinlikle ne AMD ne de Intel bugün böyle bir adlandırma düzeni kullanmıyor.
CVn

Gerçi x64 olan çok yaygın bir terim. Rastgele örnek: microsoft.com/en-us/download/details.aspx?id=42482
Paul Draper

@PaulDraper Şu anda Microsoft dünyasında yaygındır , ancak etimolojisi "x86" için böyle olmayacak şekilde belirsizliğini korumaktadır.
CVn

Microsoft, yükleyicilerinde
x86_64'ü

7

Linux ikili yürütülebilir dosyasının ( ELF biçimi, Wikipedia'ya bakın ) 5. baytı 32 bit yürütülebilir dosya için 1, 64 bit yürütülebilir dosya için 2'dir.

Bunu "foo" adlı bir programda görmek için komut satırına yazın

od -t x1 -t c foo | head -n 2

2

'Kafa' borusundan kaçınmak isterseniz,

od -An -t x1 -j 4 -N 1 foo

Eğer foo 32 bit ikilik ise 01 ve 64 ise 02 yazacaktır. Hala önde gelen boşluklar içerebilir - sonuçlarda otomatik karşılaştırmalar yapıp yapmadığınızı bilmeye değer.

Bu, 'dosya'nın yüklü olmadığı temel bir Ubuntu Docker kapsayıcısında yararlı bulunursa.

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.