Le fichier (outil cmd) montre que /bin/ls est un binaire universel sur macOS (Sonoma 14.2.1 sur Apple M1) et otool -f confirme cela:
% file /bin/ls
/bin/ls: binaire universel Mach-O avec 2 architectures: [x86_64:Exécutable 64-bit x86_64 Mach-O] [arm64e:Exécutable 64-bit arm64e Mach-O]
/bin/ls (pour l'architecture x86_64): Exécutable 64-bit x86_64 Mach-O
/bin/ls (pour l'architecture arm64e): Exécutable 64-bit arm64e Mach-O
% otool -f /bin/ls
En-têtes Fat
fat_magic 0xcafebabe
nfat_arch 2
architecture 0
cputype 16777223
cpusubtype 3
capabilities 0x0
offset 16384
size 72896
align 2^14 (16384)
architecture 1
cputype 16777228
cpusubtype 2
capabilities 0x80
offset 98304
size 88816
align 2^14 (16384)
Cependant, otool -h montre uniquement un en-tête Mach-O:
% otool -h /bin/ls
/bin/ls:
En-tête Mach
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 2 0x80 2 19 1728 0x00200085
Le même comportement peut être observé pour d'autres binaires dans le dossier /bin.
De manière intéressante, otool -h montre toutes les architectures pour les binaires universels faisant partie d'applications tierces (étant arm64, tandis que les binaires système sont arm64e). Exemple:
% otool -h /Applications/Firefox.app/Contents/MacOS/firefox
/Applications/Firefox.app/Contents/MacOS/firefox (architecture x86_64):
En-tête Mach
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777223 3 0x80 2 21 1856 0x00210085
/Applications/Firefox.app/Contents/MacOS/firefox (architecture arm64):
En-tête Mach
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 0 0x00 2 22 1880 0x00210085
Pourquoi otool -h ne montre-t-il pas l'en-tête Mach-O x86_64 pour les binaires système (arm64e) alors qu'il le montre pour les binaires tiers (arm64)?