29 votos

¿Cómo puedo distinguir los binarios ARM de los binarios x86 en MacOS?

¿Hay algo que pueda escribir en la línea de comandos para determinar si un ejecutable es un M1 binario o un binario x86?

2 votos

1 votos

Preste atención a que en MacOS (con su arquitectura "Universal Binary") no es un binario M1 O un binario x86, sino And/Or -- y también hay más arquitecturas soportadas.

49voto

Nate Puntos 220

Puede utilizar el file para ver para qué arquitecturas un binario (o biblioteca) incluye código nativo. El procesador M1 utiliza la arquitectura ARM de 64 bits, por lo que aparecerá como "arm64". No tengo un Mac M1 ni ningún binario sólo para ARM a mano, pero compara el Chrome (sólo para Intel) y Firefox (binario "universal"/"gordo" que soporta tanto Intel como ARM) en mi 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

Y aquí hay una biblioteca:

$ 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

Actualización: He comprobado un Mac M1, y parece que tiene binarios gordos Intel+ARM (que es lo mismo que Big Sur instalado en 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

Tenga en cuenta que la arquitectura aparece como "arm64 e ". La "e" es un indicador de subarquitectura; véase esta pregunta para más información. Mirando en /usr/share/file/magic/mach (que contiene los códigos mágicos file utiliza para reconocer estos tipos de archivos), también hay una subarquitectura "arm64_v8" (que creo que esta pregunta direcciones).

Y sólo para divertirse, aquí está la aplicación de ajedrez desde hace mucho tiempo en OS X v10.5, que incluía código nativo tanto para PowerPC como para Intel, cada uno en 32 y 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

2 votos

Buena llamada del SDK más antiguo - editaré mi respuesta a "actualmente se está construyendo" ya que los Macs tienen las principales arquitecturas desde 68000 -> PPC -> Intel -> Apple Silicon así como objetivos de 64 bits para algunos de los anteriores.

0 votos

@bmike sin embargo sospecho que el archivo podría no reconocer MacOS 68000 pero sólo NexTStep 68000 (y hppa y sparc - y unreleased 88000)

2 votos

@mmmmmm Tienes razón, file no reconocerá ninguno de los formatos que Apple utilizó para los binarios del 68000. Apple nunca utilizó los formatos Mach-O para el código de 68k; Mach-O llegó con la transición a OS X, momento en el que ya habían realizado la transición completa al hardware PPC. file hace reconocen el "Preferred Executable Format" (PEF) soportado por los binarios de PPC en las últimas versiones clásicas de Mac OS y las primeras de OS X, pero no los formatos aún más antiguos CFM (gestor de fragmentos de código, utilizado tanto para 68k como para PPC) y CODE resource (aún más antiguo, sólo para 68k). Para identificar los formatos CFM y CODE hay que mirar la bifurcación de recursos, y file no lo hace.

24voto

Oskar Puntos 1242

En MacOS puedes tener tres sabores de aplicación que se construyen actualmente, A, B y AB. lipo revela los pasos de construcción que el desarrollador eligió.

% lipo -archs /System/Applications/Mail.app/Contents/MacOS/Mail
x86_64 arm64

Apple documenta esto en un largo artículo - salta a la parte donde describe los pasos de construcción de la línea de comandos para los dos "sabores" del binario actual y el lipo que mezcla un binario universal de los dos. El -objetivo es lo que hace que un binario tenga un formato específico (no sólo x86_64, sino Apple y ligado a una versión específica del SDK de MacOS)

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

Para ver las arquitecturas presentes en un archivo ejecutable construido, ejecute el programa lipo o file herramientas de línea de comandos.

Tenga en cuenta que las herramientas funcionan con los binarios incrustados en el marco de la aplicación, a diferencia de la carpeta/paquete de la aplicación que la mayoría de la gente llama "la aplicación".

El file es más verboso, por lo que prefiero lipo para realizar comprobaciones de scripts u obtener detalles de un binario.

18 votos

El código de construcción es ligeramente tangencial a la pregunta, ¿no?

2 votos

Lo veo en el centro de la cuestión. Apple sólo documenta las arquitecturas en dev docs y Apple responde directamente qué herramientas oficiales de línea de comandos identifican un formato binario.

2 votos

Tengo comentario añadido sobre el uso de lipo mostrando lo escueto que es en comparación con file - @benwiggy Agradezco los comentarios y votos, espero que esta respuesta sea mucho más útil de lo que fue la versión.

3voto

SiliconChaos Puntos 73

Además de los comandos de terminal proporcionados, existen muchas aplicaciones gui para este propósito.

App 1: información sobre el silicio

Esta aplicación proporciona un sencillo indicador en la barra de menús para saber si la aplicación en primer plano se está ejecutando de forma nativa o a través de Rosetta.

App 2: silicio

Esta aplicación escanea todas las aplicaciones y establece su compatibilidad con la cpu en una lista de búsqueda.

1voto

Joop Puntos 109

Puedes obtener el tipo de cpu de un ejecutable usando objdump herramienta

objdump -x --macho ./an-exec| grep -A1 cputype

Esto mostrará X86_64 para los binarios x86 y ARM64 para un binario de silicio de Apple

Alternativamente, puede comprobar lo mismo con file cmd.

file ./an-exec

para x86 verá Mach-O 64-bit executable x86_64

para arm64 (apple silicon) verás Mach-O 64-bit executable arm64

para el binario universal verá Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]

0 votos

La mayor parte de esta respuesta se ha dado con más detalle en la respuesta aceptada apple.stackexchange.com/a/429201/237 ¿Por qué has repetido esto?

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