El archivo (herramienta cmd) muestra que /bin/ls es un binario "fat" en macOS (Sonoma 14.2.1 en Apple M1) y otool -f confirma eso:
% file /bin/ls
/bin/ls: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/bin/ls (para arquitectura x86_64): Mach-O 64-bit executable x86_64
/bin/ls (para arquitectura arm64e): Mach-O 64-bit executable arm64e
% otool -f /bin/ls
Fat headers
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)
Sin embargo, otool -h muestra solo un encabezado Mach-O:
% otool -h /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 2 0x80 2 19 1728 0x00200085
El mismo comportamiento se puede observar para otros binarios en la carpeta /bin.
Curiosamente, otool -h muestra todas las arquitecturas para binarios "fat" que forman parte de aplicaciones de terceros (siendo arm64, mientras que los binarios del sistema son arm64e). Ejemplo:
% otool -h /Applications/Firefox.app/Contents/MacOS/firefox
/Applications/Firefox.app/Contents/MacOS/firefox (arquitectura x86_64):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777223 3 0x80 2 21 1856 0x00210085
/Applications/Firefox.app/Contents/MacOS/firefox (arquitectura arm64):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 0 0x00 2 22 1880 0x00210085
¿Por qué otool -h no muestra el encabezado Mach-O x86_64 para binarios del sistema (arm64e) mientras que sí lo muestra para binarios de terceros (arm64)?