Come determinare se un file binario linux è a 32 o 64 bit?


24

Un kernel a 32 bit (x86) può eseguire solo codice a 32 bit. Un kernel a 64 bit (x86_64) può eseguire sia codice a 32 che a 64 bit.

Vorrei sapere se una macchina può eseguire un eseguibile: in altre parole, ho un file binario e devo eseguirlo su Ubuntu a 32 bit, ma non so se il file binario è eseguibile a 32 bit .

Ho usato il filecomando, specificando l'eseguibile da controllare e questo è stato il risultato restituito:

File eseguibile LSB a 64 bit ELF, x86-64, versione 1 (SYSV), collegato dinamicamente (utilizza librerie condivise), per GNU / Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07, non rimosso

Risposte:


29

La risposta alla domanda nel titolo è proprio lì all'inizio dell'output:

File eseguibile LSB a 64 bit ELF , x86-64

ELF è il formato eseguibile e collegabile , il formato di file eseguibile binario più comunemente usato da Linux.

x86-64 è l'architettura del binario, la versione a 64 bit del set di istruzioni x86 originariamente introdotto da AMD . Per motivi che vanno oltre me, Microsoft si riferisce ad esso come "x64", ma è la stessa cosa.

Se hai bisogno di conoscere l'architettura del kernel stesso, puoi usare uname -mpi. Ad esempio, sul mio sistema, che stampa:

x86_64 sconosciuto sconosciuto

il che significa che sto eseguendo un kernel x86-64.

Se sei interessato alla CPU stessa, guarda i /proc/cpuinfodettagli sulle CPU rilevate dal kernel Linux.

Un eseguibile 80x86 a 32 bit è identificato da filecome, ad esempio:

Eseguibile LSB a 32 bit ELF , Intel 80386 , versione 1 (SYSV), collegato dinamicamente (usa librerie condivise), per GNU / Linux 2.6.8, rimosso

che ci dice che è un eseguibile a 32 bit usando il set di istruzioni Intel 80386 (possibilmente con estensioni).

Si noti che non è così semplice come architetture a 32 bit contro 64 bit. Ad esempio, il kernel Linux supporta architetture a 32 bit come Intel 80386, AVR32 , S / 390 e Unicore32 . Sul lato 64-bit delle cose, Linux è utilizzabile su PA-RISC , x86-64, Itanium e Alpha , tra gli altri. Tuttavia, non tutte le distribuzioni forniscono file binari per tutte le architetture (e dubito che ci siano distribuzioni che si rivolgono allo stesso modo a tutte le architetture CPU supportate). Quindi, se vuoi sapere se un determinato binario sarà eseguibile su un dato sistema, devi considerare l' architettura , piuttosto che la dimensione della parola nativa della CPU.


1
"ragioni che vanno oltre me". Ricordo ancora il giorno in cui ho scoperto che x64 era 64 bit e x86 era 32 bit.
Paul Draper,

1
@PaulDraper Il termine "x86" ha una chiara etimologia; risale alle CPU della serie 80x86 di Intel, differenziandole dai loro predecessori come 8008 o 8080, e oggigiorno si riferisce spesso alle varianti a 32 bit (set di istruzioni IA-32) (80386, 80486, Pentium e più recenti ). Questi numeri di modello più recenti sono stati spesso abbreviati omettendo "80" all'inizio, quindi x (implicito a 32 bit) x86 corrisponde a 386, 486, ecc. Tuttavia, non sono a conoscenza di CPU a 64 bit con numeri di modello di una struttura simile che termina in "64"; certamente né AMD né Intel utilizzano oggi un tale schema di denominazione.
un CVn

Sebbene x64 sia un termine molto comune. Esempio casuale: microsoft.com/en-us/download/details.aspx?id=42482
Paul Draper

@PaulDraper E 'comune oggi nel mondo Microsoft, ma la sua etimologia è ancora chiaro in modo che che per "X 86" non lo fa.
un CVn il

Microsoft si riferisce a x86_64 come AMD64 nei loro programmi di installazione
phuclv,

7

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 "pippo", digitare dalla riga di comando

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

2

Se vuoi evitare il tubo 'testa', puoi farlo

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

Questo stamperà 01 se foo è un binario a 32 bit e 02 se è 64. Potrebbe comunque includere alcuni spazi iniziali - vale la pena sapere se stai facendo dei confronti automatici sui risultati.

Se trovato utile in un contenitore Ubuntu Docker di base in cui 'file' non è stato installato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.