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


24

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.

Je voudrais savoir si une machine peut exécuter un exécutable: en d'autres termes, j'ai un fichier binaire et je dois l'exécuter sur Ubuntu 32 bits, mais je ne sais pas si le fichier binaire est exécutable 32 bits .

J'ai utilisé la filecommande, en spécifiant l'exécutable à vérifier et ce fut le résultat retourné:

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

Réponses:


29

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

Exécutable ELF 64 bits LSB, x86-64

ELF est le format exécutable et linkable , 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 introduit à l'origine par AMD . Pour des raisons qui me dépassent, Microsoft l'appelle "x64", mais c'est la même chose.

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

x86_64 inconnu inconnu

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

Si vous êtes intéressé par le CPU lui-même, consultez les /proc/cpuinfodétails sur les CPU détectés par le noyau Linux.

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

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

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 qu'il n'est pas aussi simple que les architectures 32 bits contre 64 bits. Par exemple, le noyau Linux prend en charge les architectures 32 bits comme Intel 80386, AVR32 , S / 390 et Unicore32 . Du côté 64 bits, Linux est utilisable sur PA-RISC , x86-64, Itanium et Alpha , entre autres. Cependant, toutes les distributions ne fournissent pas de binaires pour toutes les architectures (et je doute qu'il existe des distributions qui ciblent également toutes les architectures CPU prises en charge). Donc, si vous voulez savoir si un binaire donné sera exécutable sur un système donné, vous devez considérer l' architecture , plutôt que la taille du mot natif du CPU.


1
"des raisons qui me dépassent". Je me souviens encore du jour où j'ai découvert que x64 était de 64 bits et x86 de 32 bits.
Paul Draper

1
@PaulDraper Le terme "x86" a une étymologie claire; il remonte aux processeurs Intel 80x86, les différenciant de leurs prédécesseurs comme le 8008 ou 8080, et de nos jours se réfère le plus souvent aux variantes capables de 32 bits (jeu d'instructions IA-32) (80386, 80486, Pentium et plus récents) ). Ces numéros de modèle plus récents ont souvent été abrégés en omettant le "80" au début, donc (implicite 32 bits) x86 correspond à 386, 486, etc. Cependant, je ne connais pas de CPU 64 bits avec des numéros de modèle de une structure similaire se terminant par "64"; certainement ni AMD ni Intel n'utilisent un tel schéma de dénomination aujourd'hui.
un CVn

Bien que x64 soit un terme très courant. Exemple aléatoire: microsoft.com/en-us/download/details.aspx?id=42482
Paul Draper

@PaulDraper Il est courant maintenant dans le monde Microsoft, mais son étymologie n'est pas claire d'une manière qui ne l'est pas pour "x86".
un CVn

Microsoft fait référence à x86_64 comme AMD64 dans ses installateurs
phuclv

7

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

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

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

2

Si vous voulez éviter le tuyau «tête», vous pouvez le faire

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

Cela affichera 01 si foo est un binaire 32 bits et 02 s'il est 64. Il peut toujours inclure des espaces de tête - à savoir si vous faites des comparaisons automatisées sur les résultats.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.