Y a-t-il quelque chose que je peux taper sur la ligne de commande pour déterminer si un exécutable est une M1 ou un binaire x86 ?
Réponses
Trop de publicités?Vous pouvez utiliser le file
pour savoir pour quelles architectures un binaire (ou une bibliothèque) inclut du code natif. Le processeur M1 utilise l'architecture ARM 64 bits, il sera donc listé comme "arm64". Je n'ai pas de Mac M1 ou de binaires ARM uniquement sous la main, mais je compare Chrome (Intel uniquement) et Firefox (binaire "universel"/"gros" supportant à la fois Intel et ARM) sur mon Mac :
$ file /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome: Mach-O 64-bit executable x86_64
$ file /Applications/Firefox.app/Contents/MacOS/firefox
/Applications/Firefox.app/Contents/MacOS/firefox: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]
/Applications/Firefox.app/Contents/MacOS/firefox (for architecture x86_64): Mach-O 64-bit executable x86_64
/Applications/Firefox.app/Contents/MacOS/firefox (for architecture arm64): Mach-O 64-bit executable arm64
Et voici une bibliothèque :
$ file /Applications/Firefox.app/Contents/MacOS/libmozglue.dylib
/Applications/Firefox.app/Contents/MacOS/libmozglue.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
/Applications/Firefox.app/Contents/MacOS/libmozglue.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/Applications/Firefox.app/Contents/MacOS/libmozglue.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
Mise à jour : J'ai vérifié un Mac M1, et il semble qu'il ait des binaires gras Intel+ARM (ce qui est identique à Big Sur installé sur un Mac Intel) :
$ file /System/Applications/Chess.app/Contents/MacOS/Chess
/System/Applications/Chess.app/Contents/MacOS/Chess: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/System/Applications/Chess.app/Contents/MacOS/Chess (for architecture x86_64): Mach-O 64-bit executable x86_64
/System/Applications/Chess.app/Contents/MacOS/Chess (for architecture arm64e): Mach-O 64-bit executable arm64e
Notez que l'architecture est listée comme "arm64". e ". Le "e" est un indicateur de sous-architecture ; voir cette question pour plus d'informations. En regardant dans /usr/share/file/magic/mach (qui contient les codes magiques file
utilise pour reconnaître ces types de fichiers), il y a aussi une sous-architecture "arm64_v8" (qui, je pense, n'a pas encore été reconnue par l'entreprise). cette question adresses).
Et juste pour le plaisir, voici l'application Chess de la version 10.5 d'OS X, qui comprenait du code natif pour PowerPC et Intel, à la fois en 32 et 64 bits :
$ file /Applications/Chess.app/Contents/MacOS/Chess
/Applications/Chess.app/Contents/MacOS/Chess: Mach-O universal binary with 4 architectures
/Applications/Chess.app/Contents/MacOS/Chess (for architecture ppc): Mach-O executable ppc
/Applications/Chess.app/Contents/MacOS/Chess (for architecture ppc64): Mach-O 64-bit executable ppc64
/Applications/Chess.app/Contents/MacOS/Chess (for architecture i386): Mach-O executable i386
/Applications/Chess.app/Contents/MacOS/Chess (for architecture x86_64): Mach-O 64-bit executable x86_64
Sous MacOS, vous pouvez avoir trois types d'applications en cours de construction, A, B et AB. lipo
révèle les étapes de construction choisies par le développeur.
% lipo -archs /System/Applications/Mail.app/Contents/MacOS/Mail
x86_64 arm64
Apple documente cela dans un long article - allez à la partie où il décrit les étapes de construction en ligne de commande pour les deux "saveurs" de l'actuel binaire et le lipo
qui mélange un binaire universel à partir des deux. Le site -cible est ce qui fait qu'un binaire a un format spécifique (pas seulement x86_64 mais Apple et lié à une version spécifique de MacOS SDK).
x86_app: main.c
$(CC) main.c -o x86_app -target x86_64-apple-macos10.12
arm_app: main.c
$(CC) main.c -o arm_app -target arm64-apple-macos11
universal_app: x86_app arm_app
lipo -create -output universal_app x86_app arm_app
Pour voir les architectures présentes dans un fichier exécutable construit, exécutez la commande
lipo
ofile
outils de ligne de commande.
Notez que les outils fonctionnent sur des binaires intégrés au cadre de l'application, par opposition au dossier/package de l'application que la plupart des gens appellent "l'application".
El file
est plus verbeuse, je préfère donc lipo
pour les contrôles par script ou pour obtenir les détails d'un binaire.
En plus des commandes de terminal fournies, il existe quelques applications d'interface graphique à cette fin.
- Infos sur le silicium : Cette application fournit un simple indicateur dans la barre de menu pour savoir si l'application au premier plan est exécutée nativement ou via Rosetta.
- Silicium : Cette application recherche toutes les applications et indique leur compatibilité avec le processeur dans une liste consultable.
Vous pouvez obtenir le type de processeur d'un exécutable en utilisant objdump
outil
objdump -x --macho ./an-exec| grep -A1 cputype
Cela montrera X86_64
pour les binaires x86 et ARM64
pour une Apple siliconée binaire
Alternativement, vous pouvez vérifier la même chose avec file
cmd.
file ./an-exec
pour x86, vous verrez Mach-O 64-bit executable x86_64
pour arm64 (apple silicon) vous verrez Mach-O 64-bit executable arm64
pour le binaire universel, vous verrez Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]