Kakehashi esegue programmi macOS su Linux ARM64 senza emulazione

Kakehashi carica binari macOS ARM64 su Linux aarch64, traduce le syscall Darwin e funziona già con diversi strumenti da riga di comando.

Eseguire un programma compilato per macOS su un sistema Linux ARM64, senza avviare una macchina virtuale e senza emulare il processore, sembra un obiettivo fin troppo ambizioso. Kakehashi (repository GitHub) prova a renderlo concreto: apre i programmi compilati per macOS nel formato Mach-O, cioè il tipo di file eseguibile usato dal sistema operativo Apple. Poi ricrea solo i servizi essenziali che l’applicazione si aspetta di trovare su macOS, come alcune librerie di base, la gestione dei file, della memoria e dei thread. Quando il programma chiede al sistema operativo di eseguire un’operazione, per esempio aprire un file o avviare una connessione di rete, Kakehashi intercetta la richiesta formulata secondo le regole di Darwin, il nucleo su cui si basa macOS, e la converte nell’operazione equivalente prevista dal kernel Linux.

Il progetto nasce in una fase nella quale ARM64 non rappresenta più una piattaforma marginale. Apple ha da tempo completato il passaggio dei Mac ai chip Apple Silicon, mentre i servizi cloud e le piattaforme di integrazione continua offrono sempre più spesso runner Linux basati su architettura Arm. Resta però una separazione netta: un binario macOS per Apple Silicon e un eseguibile Linux aarch64 usano istruzioni compatibili con la stessa famiglia di processori, ma si aspettano formati, librerie, convenzioni e servizi del sistema operativo differenti.

Kakehashi esegue codice macOS su Linux senza emulare la CPU

Kakehashi non punta, almeno per ora, a portare Final Cut Pro, Logic o applicazioni Cocoa sul desktop Linux. L’obiettivo dichiarato riguarda soprattutto strumenti da riga di comando impiegati nelle procedure di compilazione, test e automazione. I risultati già dimostrati includono programmi reali come 7-Zip e curl, l’accesso alla rete HTTP e HTTPS, la gestione di più thread e alcuni test compilati con Clang.

La distinzione più importante riguarda il modello di esecuzione. Kakehashi non contiene un traduttore dinamico paragonabile a Rosetta 2, QEMU TCG o agli emulatori che convertono le istruzioni di una CPU in quelle di un’altra: il codice ARM64 del programma macOS gira direttamente sul processore ARM64 della macchina Linux.

Le istruzioni matematiche, i cicli di compressione e gran parte della logica applicativa non richiedono alcuna conversione. Il runtime entra in gioco nei punti in cui il programma tenta di interagire con il sistema operativo: apertura dei file, gestione della memoria, creazione dei thread, sincronizzazione, rete, uscita dal processo e altre operazioni che su macOS passerebbero attraverso Darwin e XNU.

La scelta di lavorare soltanto tra macOS ARM64 e Linux aarch64 riduce enormemente il problema rispetto a una soluzione universale. Non serve convertire le istruzioni x86-64 in ARM64 e non occorre ricostruire ogni dettaglio di una CPU diversa. Rimane però una quantità considerevole di lavoro: condividere l’architettura del processore non significa condividere il sistema operativo.

Una bottle separa l’ambiente macOS dal file system Linux

Kakehashi organizza i programmi e le librerie ospiti all’interno di una struttura denominata bottle. La directory predefinita si trova sotto ~/.local/share/kakehashi/bottle e appare al programma macOS come la radice del proprio file system.

Il meccanismo ricorda, a livello concettuale, il prefix di Wine o una root preparata per un container, anche se l’implementazione e lo scopo sono differenti. I percorsi assoluti dell’ospite restano confinati nella bottle, mentre /Volumes/linux crea un ponte verso il file system della macchina host.

Un programma macOS può quindi leggere un file Linux tramite un percorso come /Volumes/linux/home/utente/documento.txt.

Kakehashi non crea una vera separazione di sicurezza paragonabile a quella di una macchina virtuale: il codice ospite gira nello stesso processo del runtime e con i privilegi dell’utente che ha avviato il software. La traduzione dei percorsi aiuta a fornire un ambiente coerente, ma non trasforma automaticamente la bottle in una sandbox resistente a codice ostile.

7-Zip e curl mostrano fin dove arriva oggi il progetto

La superficie compatibile comprende già operazioni sui file, memoria virtuale, thread, sincronizzazione e una parte dello stack di rete. Il comando kh install 7zip scarica e colloca nella bottle la versione Darwin ARM64 della nota uitlità di compressione. L’utente può creare, elencare, estrarre e verificare archivi usando percorsi relativi oppure il ponte /Volumes/linux.

Il supporto per curl aggiunge requisiti differenti: socket, risoluzione dei nomi, lettura e scrittura in rete, certificati, gestione degli errori e interazione con OpenSSL. I test documentati comprendono richieste HTTP, download HTTPS con verifica del certificato e il fallimento davanti a un certificato autofirmato.

Non significa che ogni opzione di curl funzioni: il progetto esclude per ora una copertura completa di proxy, richieste POST, HTTP/3, tutti i protocolli supportati dal programma e ogni possibile combinazione di flag. L’importanza del risultato sta altrove: un eseguibile macOS reale compie una connessione cifrata su Linux senza che il suo codice applicativo debba essere ricompilato.

Il confronto con Darling

Il lavoro svolto dall’autore di Kakehashi richiama inevitabilmente Darling, progetto storico che tenta di eseguire software macOS su Linux. La somiglianza generale esiste, ma le priorità e l’architettura non coincidono. Darling copre da anni una superficie più ampia, include componenti derivati da Darwin e punta anche alla compatibilità con parti superiori della piattaforma macOS.

Kakehashi sceglie invece un runtime leggero interamente in spazio utente, scritto principalmente in Rust e orientato ai binari ARM64 da riga di comando. Non introduce un modulo del kernel e non mira, allo stato attuale, a ricostruire Cocoa o un desktop macOS (dichiara tra le proprie regole di sviluppo il divieto di importare codice GPL di Darling). Tale perimetro ristretto permette di arrivare più rapidamente a risultati verificabili con specifiche utilità, ma riduce drasticamente il numero di programmi candidati a essere supportati.

L’applicazione evita di distribuire librerie proprietarie Apple, ma l’utente deve comunque verificare se la licenza dello specifico software consenta installazione, copia ed esecuzione fuori da macOS o da hardware Apple.

Kakehashi non è ancora il “Wine di macOS” e probabilmente non vuole diventarlo nel senso più comune dell’espressione. È piuttosto un ponte tecnico mirato: stretto, incompleto, ma già abbastanza solido da far funzionare programmi reali.

Ti consigliamo anche

Link copiato negli appunti