web-dev-qa-db-fra.com

Comment déterminer si un fichier binaire linux est 32 bits ou 64 bits?

Un noyau 32 bits (x86) ne peut exécuter que du code 32 bits. Un noyau 64 bits (x86_64) peut exécuter du code 32 bits et 64 bits.

J'aimerais savoir si une machine peut exécuter un fichier exécutable: en d'autres termes, j'ai un fichier binaire que je dois exécuter sous Ubuntu 32 bits, mais je ne sais pas si le fichier binaire est un fichier exécutable 32 bits. .

J'ai utilisé la commande file en spécifiant l'exécutable à vérifier et voici le résultat renvoyé:

ELF exécutable LSB 64 bits, x86-64, version 1 (SYSV), lié de manière dynamique (utilise des bibliothèques partagées), pour GNU/Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07, non supprimé

21
enzom83

La réponse à la question dans le titre se trouve juste au début de la sortie:

ELF exécutable LSB 64 bits , x86-64

ELF est le format exécutable et pouvant être lié , le format de fichier exécutable binaire le plus couramment utilisé par Linux.

x86-64 est l’architecture du binaire, la version 64 bits du jeu d’instructions x86 introduite à l’origine par DMLA . Pour des raisons qui me dépassent, Microsoft parle de "x64", mais c'est la même chose.

Si vous avez besoin de connaître l'architecture du noyau lui-même, vous pouvez utiliser uname -mpi. Par exemple, sur mon système, cela affiche:

x86_64 unknown unknown

ce qui signifie que j'utilise un noyau x86-64.

Si le processeur lui-même vous intéresse, consultez /proc/cpuinfo pour plus de détails sur le ou les processeurs détectés par le noyau Linux.

Un exécutable 80x86 32 bits est identifié par file, par exemple:

ELF exécutable LSB 32 bits , Intel 80386 , version 1 (SYSV), lié dynamiquement (utilise des bibliothèques partagées), pour GNU/Linux 2.6.8, dépouillé

ce qui nous indique qu'il s'agit d'un exécutable 32 bits utilisant le jeu d'instructions Intel 80386 (éventuellement avec des extensions).

Notez que ce n'est pas aussi simple que les architectures 32 bits par rapport aux architectures 64 bits. Par exemple, le noyau Linux prend en charge les architectures 32 bits telles que Intel 80386, AVR32 , S/390 et Unicore32 . Sur le plan 64 bits, Linux est utilisable sur PA-RISC , x86-64, Itanium et Alpha , entre autres. Cependant, toutes les distributions ne fournissent pas de fichiers binaires pour toutes les architectures (et je doute que des distributions ciblent toutes les architectures de processeur prises en charge de manière égale). Donc, si vous voulez savoir si un binaire donné sera exécutable sur un système donné, vous devez prendre en compte l'architecture , plutôt que la taille de mot native du processeur.

23
a CVn

Le 5ème octet d'un fichier exécutable binaire Linux ( au format ELF, voir Wikipedia ) correspond à 1 pour un exécutable 32 bits, 2 pour un exécutable 64 bits.

Pour voir cela avec un programme nommé "foo", tapez sur la ligne de commande

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

Si vous voulez éviter le tuyau de "tête", vous pouvez faire

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

Ceci imprimera 01 si foo est un fichier binaire 32 bits et 02 s'il s'agit de 64. Il peut toujours inclure certains espaces principaux - il est intéressant de savoir si vous effectuez des comparaisons automatisées sur les résultats.

Si cela est utile dans un conteneur Ubuntu Docker de base où le fichier n’a pas été installé.