¿Cómo determinar si un archivo binario de Linux es de 32 bits o de 64 bits?

24

Un kernel de 32 bits (x86) solo puede ejecutar código de 32 bits. Un kernel de 64 bits (x86_64) puede ejecutar código de 32 bits y de 64 bits.

Me gustaría saber si una máquina puede ejecutar un ejecutable: en otras palabras, tengo un archivo binario y tengo que ejecutarlo en Ubuntu de 32 bits, pero no sé si el archivo binario es ejecutable de 32 bits .

Usé el filecomando, especificando el ejecutable a verificar y este fue el resultado devuelto:

ELF ejecutable LSB de 64 bits, x86-64, versión 1 (SYSV), vinculado dinámicamente (usa libs compartidas), para GNU / Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07, no eliminado

enzom83
fuente

Respuestas:

29

La respuesta a la pregunta en el título está justo al principio de la salida:

ELF ejecutable LSB de 64 bits , x86-64

ELF es el formato ejecutable y enlazable , el formato de archivo ejecutable binario más utilizado por Linux.

x86-64 es la arquitectura del binario, la versión de 64 bits del conjunto de instrucciones x86 introducido originalmente por AMD . Por razones que me superan, Microsoft se refiere a él como "x64", pero eso es lo mismo.

Si necesita conocer la arquitectura del núcleo en sí, puede usar uname -mpi. Por ejemplo, en mi sistema, eso imprime:

x86_64 desconocido desconocido

lo que significa que estoy ejecutando un núcleo x86-64.

Si está interesado en la CPU en sí, busque /proc/cpuinfodetalles sobre las CPU detectadas por el kernel de Linux.

Un ejecutable 80x86 de 32 bits se identifica filecomo, por ejemplo:

ELF ejecutable LSB de 32 bits , Intel 80386 , versión 1 (SYSV), vinculado dinámicamente (usa libs compartidas), para GNU / Linux 2.6.8, despojado

que nos dice que es un ejecutable de 32 bits que usa el conjunto de instrucciones Intel 80386 (posiblemente con extensiones).

Tenga en cuenta que no es tan simple como las arquitecturas de 32 bits frente a las de 64 bits. Por ejemplo, el kernel de Linux admite arquitecturas de 32 bits como Intel 80386, AVR32 , S / 390 y Unicore32 . En el lado de 64 bits, Linux se puede usar en PA-RISC , x86-64, Itanium y Alpha , entre otros. Sin embargo, no todas las distribuciones proporcionan archivos binarios para todas las arquitecturas (y dudo que haya distribuciones que se dirijan a todas las arquitecturas de CPU compatibles por igual). Entonces, si desea saber si un binario dado será ejecutable en un sistema dado, debe considerar la arquitectura , en lugar del tamaño de palabra nativo de la CPU.

un CVn
fuente
1
"razones que están más allá de mí". Todavía recuerdo el día que descubrí que x64 tenía 64 bits y x86 tenía 32 bits.
Paul Draper
1
@PaulDraper El término "x86" tiene una etimología clara; Se remonta a las CPU de la serie 80x86 de Intel, que las diferencia de sus predecesoras como la 8008 o 8080, y en la actualidad se refiere con mayor frecuencia a las variantes con capacidad de 32 bits (conjunto de instrucciones IA-32) (80386, 80486, Pentium y más nuevas ) Estos números de modelo más recientes a menudo se abreviaron omitiendo el "80" al principio, por lo que (implícito 32 bits) x86 coincide con 386, 486, etc. Sin embargo, no conozco ninguna CPU de 64 bits con números de modelo de una estructura similar que termina en "64"; ciertamente, ni AMD ni Intel usan hoy un esquema de nombres de este tipo.
un CVn
Aunque x64 es un término muy común. Ejemplo aleatorio: microsoft.com/en-us/download/details.aspx?id=42482
Paul Draper el
@PaulDraper Es común ahora en el mundo de Microsoft, pero su etimología sigue sin estar clara de una manera que para "x86" no.
un CVn
Microsoft se refiere a x86_64 como AMD64 en sus instaladores
phuclv
7

El quinto byte de un archivo ejecutable binario de Linux ( formato ELF, consulte Wikipedia ) es 1 para un ejecutable de 32 bits, 2 para un ejecutable de 64 bits.

Para ver esto para un programa llamado "foo", escriba en la línea de comando

od -t x1 -t c foo | head -n 2
Chris Maple
fuente
2

Si desea evitar la tubería de 'cabeza', puede hacer

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

Esto imprimirá 01 si foo es un binario de 32 bits y 02 si es 64. Todavía puede incluir algunos espacios iniciales, vale la pena saber si está haciendo comparaciones automáticas en los resultados.

Si se encuentra esto útil en un contenedor básico de Ubuntu Docker donde no se instaló 'archivo'.

Quentin Stafford-Fraser
fuente