Jak ustalić, czy plik binarny linuksa jest 32-bitowy czy 64-bitowy?

24

Jądro 32-bitowe (x86) może uruchamiać tylko kod 32-bitowy. Jądro 64-bitowe (x86_64) może uruchamiać zarówno kod 32-bitowy, jak i 64-bitowy.

Chciałbym wiedzieć, czy komputer może uruchomić plik wykonywalny: innymi słowy, mam plik binarny i muszę go uruchomić na 32-bitowym systemie Ubuntu, ale nie wiem, czy plik binarny jest 32-bitowym plikiem wykonywalnym .

Użyłem filepolecenia, określając plik wykonywalny, który ma zostać sprawdzony, a oto wynik:

ELF 64-bitowy plik wykonywalny LSB, x86-64, wersja 1 (SYSV), dynamicznie połączony (wykorzystuje współdzielone biblioteki lib), dla GNU / Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07, bez pasków

enzom83
źródło

Odpowiedzi:

29

Odpowiedź na pytanie w tytule znajduje się na początku danych wyjściowych:

ELF 64-bitowy plik wykonywalny LSB, x86-64

ELF jest formatem wykonywalnym i linkowalnym , binarnym formatem plików wykonywalnych najczęściej używanym przez Linuksa.

x86-64 to architektura binarnej, 64-bitowej wersji zestawu instrukcji x86, pierwotnie wprowadzonego przez AMD . Z powodów, które są poza mną, Microsoft nazywa to „x64”, ale to samo.

Jeśli chcesz poznać architekturę samego jądra, możesz użyć uname -mpi. Na przykład w moim systemie, który drukuje:

x86_64 nieznany nieznany

co oznacza, że ​​korzystam z jądra x86-64.

Jeśli interesuje Cię sam procesor, sprawdź /proc/cpuinfoszczegóły na temat procesorów wykrytych przez jądro Linuksa.

32-bitowy plik wykonywalny 80x86 jest identyfikowany przez file, na przykład:

ELF 32-bitowy plik wykonywalny LSB, Intel 80386 , wersja 1 (SYSV), dynamicznie połączony (korzysta ze współdzielonych bibliotek), dla GNU / Linux 2.6.8, pozbawiony

co mówi nam, że jest to 32-bitowy plik wykonywalny przy użyciu zestawu instrukcji Intel 80386 (prawdopodobnie z rozszerzeniami).

Zauważ, że nie jest to tak proste jak architektura 32-bitowa w porównaniu z architekturą 64-bitową. Na przykład jądro Linux obsługuje architektury 32-bitowe, takie jak Intel 80386, AVR32 , S / 390 i Unicore32 . Po 64-bitowej stronie Linux można stosować między innymi w PA-RISC , x86-64, Itanium i Alpha . Jednak nie wszystkie dystrybucje zapewniają pliki binarne dla wszystkich architektur (i wątpię, aby istniały jakiekolwiek dystrybucje skierowane w równym stopniu na wszystkie obsługiwane architektury procesorów). Więc jeśli chcesz wiedzieć, czy dany plik binarny będzie wykonywalny w danym systemie, musisz wziąć pod uwagę architekturę , a nie rozmiar natywnego słowa procesora.

CVn
źródło
1
„powody, które są poza mną”. Nadal pamiętam dzień, w którym dowiedziałem się, że x64 to 64 bity, a x86 to 32 bity.
Paul Draper
1
@PaulDraper Termin „x86” ma wyraźną etymologię; pochodzi z procesorów Intel serii 80x86, co odróżnia je od ich poprzedników, takich jak 8008 lub 8080, i obecnie najczęściej odnosi się do wariantów obsługujących 32-bit (zestaw instrukcji IA-32) (80386, 80486, Pentium i nowsze ). Te nowsze numery modeli były często skracane przez pominięcie „80” na początku, więc (domyślnie 32-bitowe) x86 pasuje do 386, 486 itd. Jednak nie znam żadnych 64-bitowych procesorów z numerami modeli podobna struktura zakończona na „64”; z pewnością ani AMD, ani Intel nie używają dziś takiego schematu nazewnictwa.
CVn
Chociaż x64 jest bardzo popularnym terminem. Przypadkowy przykład: microsoft.com/en-us/download/details.aspx?id=42482
Paul Draper
@PaulDraper To wspólne teraz w świecie Microsoft, ale jego etymologia pozostaje niejasny w sposób, który dla „x86” nie.
CVn
Microsoft odnosi się do x86_64 jako AMD64 w swoich instalatorach
phuclv
7

Piąty bajt binarnego pliku wykonywalnego systemu Linux ( format ELF, patrz Wikipedia ) to 1 dla 32-bitowego pliku wykonywalnego, 2 dla 64-bitowego pliku wykonywalnego.

Aby zobaczyć to dla programu o nazwie „foo”, wpisz w wierszu polecenia

od -t x1 -t c foo | head -n 2
Chris Maple
źródło
2

Jeśli chcesz uniknąć „głowicy”, możesz to zrobić

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

Spowoduje to wydrukowanie 01, jeśli foo jest 32-bitowym plikiem binarnym, a 02, jeśli jest to 64. Może nadal zawierać kilka wiodących spacji - warto wiedzieć, czy przeprowadzasz automatyczne porównania wyników.

Jeśli okaże się to przydatne w podstawowym kontenerze Ubuntu Docker, w którym „plik” nie został zainstalowany.

Quentin Stafford-Fraser
źródło