La risposta alla domanda nel titolo è proprio lì all'inizio dell'output:
ELF 64 bit Eseguibile LSB, x86-64
ELF è il formato eseguibile e collegabile, il formato di file eseguibile binario più comunemente utilizzato da Linux.
x86-64 è l'architettura del binario, la versione a 64 bit del set di istruzioni x86 originariamente introdotto da AMD. Per ragioni che mi sfuggono, Microsoft lo chiama "x64", ma è la stessa cosa.
Se hai bisogno di conoscere l'architettura del kernel stesso, puoi usare uname -mpi
. Ad esempio, sul mio sistema, stampa:
x86_64 sconosciuto sconosciuto
il che significa che sto eseguendo un kernel x86-64.
Se sei interessato alla CPU stessa, guarda /proc/cpuinfo
per i dettagli sulle CPU rilevate dal kernel Linux.
Un eseguibile 80x86 a 32 bit è identificato da file
come, ad esempio:
ELF 32 bit Eseguibile LSB, Intel 80386 , versione 1 (SYSV), collegata dinamicamente (usa librerie condivise), per GNU/Linux 2.6.8, spogliata
che ci dice che è un eseguibile a 32 bit che utilizza il set di istruzioni Intel 80386 (possibilmente con estensioni).
Si noti che non è così semplice come architetture a 32 bit rispetto a 64 bit. Ad esempio, il kernel Linux supporta architetture a 32 bit come Intel 80386, AVR32, S/390 e Unicore32. Sul lato a 64 bit, Linux è utilizzabile su PA-RISC, x86-64, Itanium e Alpha, tra gli altri. Tuttavia, non tutte le distribuzioni forniscono binari per tutte le architetture (e dubito che esistano distribuzioni che prendono di mira tutte architetture CPU supportate allo stesso modo). Quindi, se vuoi sapere se un dato binario sarà eseguibile su un dato sistema, devi considerare l'architettura , piuttosto che la dimensione della parola nativa della CPU.
Il quinto byte di un file eseguibile binario Linux (formato ELF, vedi Wikipedia) è 1 per un eseguibile a 32 bit, 2 per un eseguibile a 64 bit.
Per vedere questo per un programma chiamato "foo", digita nella riga di comando
od -t x1 -t c foo | head -n 2
Se vuoi evitare il tubo di "testa", puoi farlo
od -An -t x1 -j 4 -N 1 foo
Verrà stampato 01 se foo è un binario a 32 bit e 02 se è 64. Potrebbe comunque includere alcuni spazi iniziali:vale la pena sapere se stai effettuando confronti automatici sui risultati.
Se trovato utile in un contenitore Ubuntu Docker di base in cui 'file' non è stato installato.