Mach-O
# Mach-O

Mach-O, abbreviazione di Mach object file format, è un formato file per eseguibili, codice oggetto, librerie condivise, codice caricato dinamicamente e core dump sviluppato principalmente per macOS. È stato sviluppato per sostituire il formato a.out .

Mach-O è utilizzato da alcuni sistemi basati sul kernel Mach . NeXTSTEP, macOS e iOS sono esempi di sistemi che utilizzano questo formato per eseguibili nativi, librerie e codice oggetto.

## Layout tipico di un file Mach-O

Ogni file Mach-O è costituito da un'intestazione Mach-O, seguita da una serie di comandi di caricamento, seguiti da uno o più segmenti, ognuno dei quali contiene da 0 a 255 sezioni. Mach-O utilizza il formato di rilocazione REL per gestire i riferimenti ai simboli. Durante la ricerca dei simboli, Mach-O utilizza uno namespace a due livelli che codifica ogni simbolo in una coppia "nome oggetto/simbolo" che viene quindi ricercata linearmente, prima dall'oggetto e poi dal nome del simbolo.

La struttura di base, un elenco di "comandi di caricamento"(chiamati Load Commands) di lunghezza variabile che fa riferimento a pagine di dati altrove nel file , è stata utilizzata anche nel formato di file eseguibile per Accent . Il formato del file Accent era a sua volta basato su un'idea di Spice Lisp .

## Binari multi-architettura

Più file Mach-O possono essere combinati in un file binario multi-architettura . Ciò consente a un singolo file binario di contenere codice per supportare più architetture di set di istruzioni, ad esempio per diverse generazioni e tipi di dispositivi Apple, comprese diverse architetture di processori come ARM64 e x86-64 .

## Versione minima del sistema operativo

Con l'introduzione della piattaforma Mac OS X 10.6, il file Mach-O ha subito una modifica significativa che fa sì che i binari compilati su un computer che esegue 10.6 o versioni successive siano (per impostazione predefinita) eseguibili solo su computer che eseguono Mac OS X 10.6 o versioni successive. La differenza deriva dai comandi di caricamento che il linker dinamico, nelle precedenti versioni di Mac OS X, non comprende. Un altro cambiamento significativo al formato Mach-O è il cambiamento nel modo in cui funzionano le tabelle Link Edit (che si trovano nella sezione __LINKEDIT). In 10.6 queste nuove tabelle Link Edit vengono compresse rimuovendo i bit di informazioni inutilizzati e non necessari, tuttavia Mac OS X 10.5 e versioni precedenti non possono leggere questo nuovo formato di tabella Link Edit. Per creare eseguibili retrocompatibili, è possibile utilizzare il flag del linker "-mmacosx-version-min=".

## Altre implementazioni

Ad alcune versioni di NetBSD è stato aggiunto il supporto per Mach-O come parte di un'implementazione della compatibilità binaria, che ha consentito l'esecuzione di alcuni binari di Mac OS 10.3.

Per Linux, Shinichiro Hamaji ha scritto un caricatore Mach-O che può caricare binari 10.6. Come soluzione più ampia basata su questo caricatore, il progetto Darling mira a fornire un ambiente completo che consenta l'esecuzione delle applicazioni macOS su Linux.

Per il linguaggio di programmazione Ruby, la libreria ruby-macho fornisce un'implementazione di un parser binario ed editor Mach-O.

## Guarda anche

* Binario grasso
* Binario universale
* Passaggio del Mac ai processori Intel
* Passaggio del Mac al silicio Apple
* Xcode
* ELFO
* Confronto di formati di file eseguibili
