0 votos

Otool muestra solo una arquitectura para binarios universales en macOS

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)?

2voto

user43889 Puntos 266

Vea esta pregunta de casi 10 años https://stackoverflow.com/questions/27354315/what-is-the-difference-between-mach-headers-and-fat-headers sobre los encabezados mach y fat.

Creo que sigue siendo correcto y lo que necesitas es:

otool -h -arch all /bin/ls

o (mejor porque descodifica algunos elementos):

otool -hV -arch all /bin/ls

para dar:

/bin/ls (arquitectura x86_64):
Encabezado Mach
      magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   X86_64        ALL  0x00     EXECUTE    18       1816   NOUNDEFS DYLDLINK TWOLEVEL PIE
/bin/ls (arquitectura arm64e):
Encabezado Mach
      magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64    ARM64          E USR00     EXECUTE    19       1728   NOUNDEFS DYLDLINK TWOLEVEL PIE

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X