Mach-O , abreviatura de formato de archivo de objeto Mach , es un formato de archivo para ejecutables , código objeto , bibliotecas compartidas , código cargado dinámicamente y volcados de núcleo . Como reemplazo del formato a.out , Mach-O ofrece más extensibilidad y acceso más rápido a la información en la tabla de símbolos . [ cita requerida ]
Extensión de nombre de archivo | ninguno, .o , .dylib , .bundle |
---|---|
Identificador de tipo uniforme (UTI) | com.apple.mach-o-binary |
Desarrollado por | Universidad Carnegie Mellon , Apple Inc. |
Tipo de formato | Binario , ejecutable , objeto , bibliotecas compartidas , volcado de memoria |
Contenedor para | ARM , SPARC , PA-RISC , PowerPC y código ejecutable x86 , volcados de imágenes de memoria |
Mach-O es utilizado por la mayoría de los sistemas basados en el kernel de Mach . NeXTSTEP , macOS e iOS son ejemplos de sistemas que utilizan este formato para ejecutables nativos, bibliotecas y código de objeto.
Diseño de archivo Mach-O
Cada archivo Mach-O se compone de un encabezado Mach-O, seguido de una serie de comandos de carga, seguidos de uno o más segmentos, cada uno de los cuales contiene entre 0 y 255 secciones. Mach-O usa el formato de reubicación REL para manejar referencias a símbolos. Al buscar símbolos, Mach-O usa un espacio de nombres de dos niveles que codifica cada símbolo en un par de 'objeto / nombre de símbolo' que luego se busca linealmente, primero por el objeto y luego por el nombre del símbolo. [1]
La estructura básica, una lista de "comandos de carga" de longitud variable que hacen referencia a páginas de datos en otras partes del archivo [2] , también se usó en el formato de archivo ejecutable para Accent . [ cita requerida ] El formato de archivo Accent fue a su vez, basado en una idea de Spice Lisp . [ cita requerida ]
Binarios de arquitectura múltiple
En NeXTSTEP , OPENSTEP , macOS e iOS , se pueden combinar varios archivos Mach-O en un binario de arquitectura múltiple . Esto permite que un solo archivo binario contenga código para admitir múltiples arquitecturas de conjuntos de instrucciones. Por ejemplo, un binario de arquitectura múltiple para iOS puede tener 7 arquitecturas de conjuntos de instrucciones, a saber, ARMv6 (para iPhone , 3G y iPod touch de 1ra / 2da generación ), ARMv7 (para iPhone 3GS , 4 , 4S , iPad , 2 , 3ra generación y IPod touch de 3.a a 5.a generación), ARMv7s (para iPhone 5 y iPad (4.a generación) ), ARMv8-A A64 también conocido como arm64 (para iPhone 5S a iPhone X ), ARMv8.3-A A64 también conocido como arm64e (para iPhone XS y MacBook Air (M1) ), x86 (para simulador de iPhone en máquinas de 32 bits) y x86_64 (simulador de 64 bits). [ cita requerida ]
Versión mínima del sistema operativo
Con la introducción de la plataforma Mac OS X 10.6 , el archivo Mach-O sufrió una modificación significativa que hace que los binarios compilados en una computadora con 10.6 o posterior sean (por defecto) ejecutables solo en computadoras con Mac OS X 10.6 o posterior. La diferencia se debe a los comandos de carga que el enlazador dinámico , en versiones anteriores de Mac OS X, no comprende. Otro cambio significativo en el formato Mach-O es el cambio en cómo funcionan las tablas de edición de enlaces (que se encuentran en la sección __LINKEDIT). En 10.6, estas nuevas tablas de edición de enlaces se comprimen eliminando bits de información no utilizados e innecesarios, sin embargo, Mac OS X 10.5 y versiones anteriores no pueden leer este nuevo formato de tabla de edición de enlaces. Para hacer ejecutables compatibles con versiones anteriores, se puede usar la bandera del enlazador "-mmacosx-version-min =".
Otras implementaciones
Algunas versiones de NetBSD han agregado compatibilidad con Mach-O como parte de una implementación de compatibilidad binaria, lo que permitió la ejecución de algunos binarios de Mac OS 10.3. [3] [4]
Para Linux, Shinichiro Hamaji [5] escribió un cargador Mach-O que puede cargar 10.6 binarios. Como solución más amplia basada en este cargador, Darling Project tiene como objetivo proporcionar un entorno completo que permita que las aplicaciones OS X se ejecuten en Linux.
Para el lenguaje de programación Ruby , la biblioteca ruby-macho [6] proporciona una implementación de un analizador y editor binario Mach-O.
Ver también
- Binario gordo
- Binario universal
- Transición de Mac a procesadores Intel
- Transición de Mac al silicio de Apple
- Xcode
- DUENDE
- Comparación de formatos de archivos ejecutables
Referencias
- ^ "Referencia de formato de archivo OS X ABI Mach-O" . Apple Inc. 4 de febrero de 2009. Archivado desde el original el 19 de agosto de 2009 . Consultado el 27 de abril de 2016 .
- ^ Avadis Tevanian, Jr .; Richard F. Rashid; Michael W. Young; David B. Golub; Mary R. Thompson; William Bolosky; Richard Sanzi. "Una interfaz Unix para memoria compartida y archivos mapeados en memoria bajo Mach" : 8. Cite journal requiere
|journal=
( ayuda ) - ^ Emmanuel Dreyfus (20 de junio de 2006). "Compatibilidad binaria de Mach y Darwin [ sic ] para NetBSD / powerpc y NetBSD / i386" . Consultado el 18 de octubre de 2013 .
- ^ Emmanuel Dreyfus (septiembre de 2004), compatibilidad binaria de Mac OS X en NetBSD: desafíos e implementación (PDF)
- ^ Shinichiro Hamaji, cargador Mach-O para Linux - escribí ...
- ^ William Woodruff, una biblioteca puramente Ruby para analizar archivos Mach-O.
enlaces externos
- Referencia de formato de archivo OS X ABI Mach-O (Apple Inc.)
- - Manual de formatos de archivo de Darwin y macOS
- Archivos de objetos Mach (documentación de NEXTSTEP)
- Referencia de la biblioteca dinámica Mach-O
- Trucos de vinculación y carga de Mach-O
- MachOView