La respuesta a la pregunta en el título está justo al comienzo de la salida:
ELF 64 bits Ejecutable LSB, x86-64
ELF es el formato ejecutable y vinculable, 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 motivos que me superan, Microsoft se refiere a él como "x64", pero es lo mismo.
Si necesita conocer la arquitectura del kernel en sí, puede usar uname -mpi
. Por ejemplo, en mi sistema, eso imprime:
x86_64 desconocido desconocido
lo que significa que estoy ejecutando un kernel x86-64.
Si está interesado en la CPU en sí, mire /proc/cpuinfo
para obtener detalles sobre las CPU detectadas por el kernel de Linux.
Un ejecutable de 80x86 de 32 bits se identifica con file
como, por ejemplo:
ELF 32 bits Ejecutable LSB, Intel 80386 , versión 1 (SYSV), vinculado dinámicamente (usa bibliotecas compartidas), para GNU/Linux 2.6.8, despojado
lo que nos dice que es un ejecutable de 32 bits que utiliza 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 las cosas 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 dirigidas a todas). arquitecturas de CPU admitidas por igual). Entonces, si desea saber si un binario determinado será ejecutable en un sistema determinado, debe considerar la arquitectura , en lugar del tamaño de palabra nativo de la CPU.
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
Si desea evitar el tubo de 'cabeza', puede hacerlo
od -An -t x1 -j 4 -N 1 foo
Esto imprimirá 01 si foo es un binario de 32 bits y 02 si es de 64 bits. Todavía puede incluir algunos espacios iniciales; vale la pena saber si está haciendo comparaciones automáticas de los resultados.
Si encuentra esto útil en un contenedor básico de Ubuntu Docker donde no se instaló 'archivo'.