
Reverse engineering potenziato dall'IA di Rosetta (2 per Linux). Dichiarazione di non responsabilità: a causa dell'accordo con l'utente, non toccherò il codice. Tutto è fatto dall'IA, quindi potrebbe esserci un'implementazione disordinata.
Un approfondito sforzo di reverse engineering per comprendere e documentare la tecnologia di traduzione binaria Rosetta 2 di Apple.
A novembre 2020, Apple ha annunciato i primi Mac con Apple Silicon, segnando una transizione storica dai processori Intel x86_64 ai propri chip M1 basati su ARM. È stata la terza importante transizione di architettura di Apple:
Ogni transizione ha richiesto una soluzione di traduzione binaria per eseguire il software esistente durante il periodo di migrazione. Rosetta 2 è il sistema di traduzione binaria più sofisticato di Apple finora.
Rosetta (2006-2011) è stato il primo software di traduzione binaria dinamica di Apple, che consentiva alle applicazioni PowerPC di funzionare sui Mac basati su Intel.
Rosetta è stato rimosso in Mac OS X 10.7 (Lion), completando la transizione Intel.
Rosetta 2 è la tecnologia avanzata di traduzione binaria dinamica di Apple che consente alle applicazioni compilate per Intel x86_64 Mac di funzionare su Mac con Apple Silicon (ARM64).
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Tecnologie Chiave
1. **Traduzione Ahead-of-Time (AOT)**
- Traduce i binari x86_64 in ARM64 al momento dell'installazione
- Memorizza il codice tradotto in una cache per avvii successivi più rapidi
- Riduce il sovraccarico di runtime rispetto alla traduzione JIT pura
2. **Traduzione Just-in-Time (JIT)**
- Traduce blocchi di codice su richiesta durante l'esecuzione
- Gestisce codice caricato dinamicamente e codice auto-modificante
- Mantiene una cache di traduzione per l'efficienza
3. **Traduzione del Set di Istruzioni**
- Mapping delle istruzioni x86_64 -> ARM64
- Traduzione delle istruzioni vettoriali SSE/AVX -> NEON
- Flag x86_64 -> codici di condizione ARM64
4. **Traduzione delle Chiamate di Sistema**
- Traduce le syscall di macOS x86_64 in equivalenti ARM64
- Gestisce diverse convenzioni di chiamata
- Gestisce lo stato dei registri attraverso i confini delle syscall
5. **Supporto Runtime**
- Emulazione del rilevamento delle funzionalità della CPU
- Gestione della memoria locale del thread
- Gestione dei segnali e delle eccezioni
---
## Come Apple Distribuisce Rosetta 2 in macOS
### Posizione di Installazione
Rosetta 2 si trova in:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
oah sta per "Old Architecture Hardware" - una continuazione dell'era di transizione PowerPC.
Su Mac con Apple Silicon, Rosetta 2 non è installato per impostazione predefinita. Viene attivato in due modi:
┌──────────────────────────────────────────────────────────────────┐ │ Phase 1: Binary Loading │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Load x86_64 Mach-O binary │ │ 2. Parse segments, sections, symbols │ │ 3. Validate code signatures │ │ 4. Map into translation context │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Phase 2: AOT Translation │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Disassemble x86_64 code sections │ │ 2. Translate instructions to ARM64 │ │ 3. Apply optimizations │ │ 4. Store in translation cache (~/.oah) │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Phase 3: Runtime Execution │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Load translated ARM64 code │ │ 2. Set up x86_64 emulation context │ │ 3. Handle JIT translations for dynamic code │ │ 4. Translate syscalls on-the-fly │ └──────────────────────────────────────────────────────────────────┘
### Sfide chiave della traduzione
1. **Mappatura dei registri**
- x86_64 ha 16 GPR; ARM64 ha 31 GPR
- Registro flag x86_64 -> flag NZCV di ARM64
- Emulazione di RIP (instruction pointer)
2. **Ordinamento della memoria**
- x86_64: Ordinamento forte della memoria (TSO)
- ARM64: Ordinamento debole della memoria
- Richiede barriere di memoria per la correttezza
3. **Istruzioni vettoriali**
- SSE (128 bit) -> mappatura diretta NEON (128 bit)
- AVX (256 bit) -> emulazione a coppie NEON
- Gestione delle eccezioni diversa per SIMD
4. **Convenzioni di chiamata**
- x86_64: Primi 6 argomenti in registri (RDI, RSI, RDX, RCX, R8, R9)
- ARM64: Primi 8 argomenti in registri (X0-X7)
- Diversi layout dello stack frame
---
## Questo Progetto
Questo repository contiene implementazioni reverse-engineered di funzioni dai binari di Rosetta 2. Attraverso un'attenta analisi e decompilazione, abbiamo identificato e documentato lo scopo semantico di centinaia di funzioni.
### Obiettivi
1. **Educativo**: Comprendere come funziona Rosetta 2 internamente
2. **Documentazione**: Creare documentazione completa delle tecniche di traduzione
3. **Implementazione**: Fornire implementazioni C pulite e ben documentate
4. **Community**: Condividere la conoscenza con la comunità del reverse engineering
### Cosa Abbiamo Realizzato
- **828 funzioni** identificate e nominate nel binario principale `rosetta`
- **612 funzioni** completamente implementate con codice C pulito
- **66 categorie** di funzionalità documentate
- Mappature complete dei nomi delle funzioni con nomi semantici
### Categorie di Funzioni
| Categoria | Funzioni | Descrizione |
|-----------|----------|-------------|
| Punto di ingresso | 1 | Inizializzazione di Rosetta |
| Operazioni FP/Vettoriali | ~20 | Gestione dello stato di virgola mobile e SIMD |
| Operazioni di memoria SIMD | ~10 | memchr, memcmp, memcpy con SIMD |
| Operazioni vettoriali | ~30 | Aritmetica vettoriale NEON, confronto |
| Traduzione binaria | ~50 | Traduzione di istruzioni da x86_64 a ARM64 |
| Gestori di syscall | ~60 | Traduzione e inoltro delle chiamate di sistema |
| Gestione memoria | ~20 | Wrapper per malloc, free, mmap |
| Funzioni hash | ~5 | Hashing degli indirizzi per la cache di traduzione |
| Operazioni su stringhe | ~30 | Funzioni stringa ottimizzate con SIMD |
| Estensioni crittografiche | ~30 | Pass-through di AES, SHA, CRC32 |
| Parsing ELF | ~15 | Supporto per formato binario Linux |
| Cache di traduzione | ~20 | Gestione cache AOT/JIT |
---
## Struttura dei file
### File principali```
Rosetta2/
├── README.md # This file
├── rosetta_decomp.c # Original decompilation (74,677 lines)
├── rosettad_decomp.c # Daemon decompilation (44,064 lines)
├── rosetta_refactored.c # Minimal wrapper (59 lines) - includes modular headers
├── rosetta_refactored.c.legacy # Legacy refactored code (19,302 lines) - archived
├── rosetta_refactored.h # Main header (1,215 lines)
├── rosetta_refactored_complete.c # Single-file implementation (2,686 lines)
├── rosetta_function_map.h # Function name mapping (828 functions)
├── rosettad_refactored.c # Daemon-side refactoring
└── SESSION_*.md # Session logs (30+ sessions)
L'infrastruttura di traduzione è completamente modularizzata in componenti categorizzati:``` ├── rosetta_types.h # Base type definitions ├── rosetta_x86_decode.h/.c # x86 decoder ├── rosetta_arm64_emit.h/.c # ARM64 emitter ├── rosetta_translate_alu.h/.c # ALU translations ├── rosetta_translate_memory.h/.c # Memory translations ├── rosetta_translate_branch.h/.c # Branch translations ├── rosetta_translate_bit.h/.c # Bit manipulation ├── rosetta_translate_string.h/.c # String operations ├── rosetta_translate_special.h/.c # Special instructions ├── rosetta_translate_block.h/.c # Block translation coordinator ├── rosetta_translate_dispatch.h/.c # Instruction dispatch ├── rosetta_trans_dispatch.h/.c # Main dispatch layer ├── rosetta_trans_alu.h/.c # ALU emulation layer ├── rosetta_trans_mem.h/.c # Memory emulation layer ├── rosetta_trans_branch.h/.c # Branch emulation layer ├── rosetta_trans_bit.h/.c # Bit emulation layer ├── rosetta_trans_string.h/.c # String emulation layer ├── rosetta_trans_special.h/.c # Special instruction emulation ├── rosetta_trans_system.h/.c # System instruction emulation ├── rosetta_trans_neon.h/.c # NEON emulation layer └── Makefile.modular # Modular build system
### Moduli funzionali
Moduli di infrastruttura e supporto principali:```
├── rosetta_jit.h/.c # JIT compilation infrastructure
├── rosetta_exec.h/.c # Execution engine (NEW)
├── rosetta_init.h/.c # Initialization & FP registers (NEW)
├── rosetta_codegen.h/.c # Code generation primitives
├── rosetta_cache.h/.c # Translation cache (AOT/JIT)
├── rosetta_transcache.h/.c # Translation cache management
├── rosetta_context.h/.c # CPU context management
├── rosetta_runtime.h/.c # Runtime support
├── rosetta_hash.h/.c # Address hashing
├── rosetta_memmgmt.h/.c # Memory management
├── rosetta_memory_utils.h/.c # Memory utilities
├── rosetta_utils.h/.c # Utility functions
├── rosetta_string_utils.h/.c # String utilities
├── rosetta_trans_helpers.h/.c # Translation helpers
├── rosetta_refactored_helpers.h/.c # Refactoring helpers
└── rosetta_refactored_types.h # Refactored type definitions
Moduli di operazioni SIMD e vettoriali:``` ├── rosetta_simd.h/.c # SIMD operations ├── rosetta_simd_mem.h/.c # SIMD memory operations ├── rosetta_simd_mem_helpers.h/.c # SIMD memory helpers ├── rosetta_vector.h/.c # Vector operations ├── rosetta_refactored_vector.h/.c # Refactored vector ops ├── rosetta_jit_emit.h/.c # JIT emission ├── rosetta_jit_emit_simd.h/.c # SIMD JIT emission ├── rosetta_fp_translate.h/.c # FP translation ├── rosetta_fp_helpers.h/.c # FP helpers ├── rosetta_trans_neon.c # NEON translation └── rosetta_string_simd.c # SIMD string operations
### Moduli di syscall
Gestione e traduzione delle syscall guest:```
├── rosetta_syscalls.h/.c # Syscall translation core
├── rosetta_syscalls_impl.h/.c # Syscall implementations
└── rosetta_crypto.h/.c # Crypto instructions (AES, SHA, CRC32)
Moduli aggiuntivi di traduzione e supporto:``` ├── rosetta_translate.h/.c # Translation core ├── rosetta_translate_alu_impl.h/.c # ALU implementation details ├── rosetta_translate_memory_impl.h/.c # Memory implementation details ├── rosetta_translate_branch_impl.h/.c # Branch implementation details ├── rosetta_translate_special_impl.h/.c # Special implementation details └── rosetta_arm64_insns.h # ARM64 instruction definitions
### File di test```
├── test_jit.c # JIT unit tests (737 lines)
└── test_translate.c # Translation tests (1,059 lines)
Totale: 50+ file sorgente, ~150.000+ righe di codice
make -f Makefile.modular all
### Costruzione dei singoli componenti```bash
# Compile core modules
gcc -c -I. -std=c11 rosetta_types.h
gcc -c -I. -std=c11 rosetta_codegen.c
gcc -c -I. -std=c11 rosetta_jit.c
gcc -c -I. -std=c11 rosetta_x86_decode.c
gcc -c -I. -std=c11 rosetta_arm64_emit.c
# Compile translation modules
gcc -c -I. -std=c11 rosetta_translate_alu.c
gcc -c -I. -std=c11 rosetta_translate_memory.c
gcc -c -I. -std=c11 rosetta_translate_branch.c
gcc -c -I. -std=c11 rosetta_translate_block.c
gcc -c -I. -std=c11 rosetta_translate_dispatch.c
# Compile support modules
gcc -c -I. -std=c11 rosetta_cache.c
gcc -c -I. -std=c11 rosetta_context.c
gcc -c -I. -std=c11 rosetta_syscalls.c
gcc -c -I. -std=c11 rosetta_runtime.c
make -f Makefile.modular test_jit
make -f Makefile.modular test_translate
### Utilizzo come libreria```bash
# Link against the static library
gcc -o my_app my_app.c -L. -lrosetta
# Or compile with source files directly
gcc -I. -o my_app my_app.c rosetta_*.c
Il file decompilato originale rosetta_decomp.c contiene stringhe letterali che rivelano la struttura del codice sorgente originale. Questi nomi di file compaiono nei messaggi di asserzione/errore in tutto il binario.
Nota: Il codice rifattorizzato utilizza una struttura diversa, più modulare, rispetto all'originale.
Register.hTaggedPointer.hRedBlackTree.hTransactionalList.hTranslator.hAssemblerBuffer.hBuilderBase.hIrBuilder_x86.hRepatch.cppDecoder.cppFixup.cppAssemblerHelpers.cppOperand.cppOpcode.cppBasicBlock.cppThreadContextFcntl.cppInitStack.cppThread.cppThreadContext.cppThreadContextRuntimeSignals.cppThreadContextVm.cppVMAllocationTracker.cppAssemblerBase.hppTranslatorBase.hppL'infrastruttura di traduzione è completamente modularizzata nei seguenti componenti:
Totale: 40+ componenti modulari
Questo progetto è solo a scopo educativo e di ricerca.
Licenza MIT - Vedere il file LICENSE per i dettagli.
I contributi sono benvenuti! Aree di interesse:
Ultimo aggiornamento: febbraio 2026
| Componente | Descrizione |
|---|
RosettaLinux/rosetta | Binario ARM64 principale contenente il motore di traduzione |
RosettaLinux/rosettad | Demone di sistema che gestisce i servizi di traduzione |
debugserver -> /usr/libexec/rosetta/debugserver | Supporto per il debug dei processi tradotti |
libRosettaRuntime | Libreria runtime collegata durante la traduzione |
translate_tool -> /usr/libexec/rosetta/translate_tool | Strumento di traduzione per creare binari tradotti |
Vdso.cppProcMapsParser.cppThreadContextSignals.cppThreadContextSyscalls.cppTranslationCacheAot.cppTranslationCacheJit.cppTranslationCache.cppTranslator.cppRuntimeLibraryBridgeInternal.cppTwoLevelOffsetMap.cppDeltaCodedOffsetMap.cpp| Metrica | Valore |
|---|
| Funzioni totali | 828 |
| Funzioni mappate | 828 (100%) |
| Funzioni implementate | 600+ |
| Completamento | ~75% |
| Categorie documentate | 66 |
| File sorgente | 56 C + 65 H |
| Totale righe di codice | ~150.000+ |
| Categoria modulo | File | Descrizione |
|---|
| Tipi base | rosetta_types.h | Definizioni dei tipi base |
| Motore di esecuzione | rosetta_exec.h/.c | esecuzione_tradotta, cambio contesto |
| Inizializzazione | rosetta_init.h/.c | init_translation_env, registri FP |
| Decodifica x86 | rosetta_x86_decode.h/.c | Decodificatore di istruzioni x86_64 |
| Emissione ARM64 | rosetta_arm64_emit.h/.c | Emissione di codice ARM64 |
| Generazione codice | rosetta_codegen.h/.c | Primitivi di generazione codice |
| Core JIT | rosetta_jit.h/.c | Infrastruttura di compilazione JIT |
| Cache di traduzione | rosetta_cache.h/.c, rosetta_transcache.h/.c | Caching dei blocchi (AOT/JIT) |
| Traduzione blocchi | rosetta_translate_block.h/.c | Traduzione di blocchi base |
| Dispatch istruzioni | rosetta_trans_dispatch.h/.c | Dispatch delle istruzioni |
| Traduzione ALU | rosetta_translate_alu.h/.c, rosetta_trans_alu.h/.c | Operazioni aritmetiche/logiche |
| Traduzione memoria | rosetta_translate_memory.h/.c, rosetta_trans_mem.h/.c | Operazioni di load/store |
| Traduzione branch | rosetta_translate_branch.h/.c, rosetta_trans_branch.h/.c | Flusso di controllo |
| Traduzione bit | rosetta_translate_bit.h/.c, rosetta_trans_bit.h/.c | Manipolazione bit |
| Traduzione stringhe | rosetta_translate_string.h/.c, rosetta_trans_string.h/.c | Operazioni su stringhe |
| Traduzione speciale | rosetta_translate_special.h/.c, rosetta_trans_special.h/.c | Istruzioni speciali |
| Traduzione sistema | rosetta_trans_system.h/.c | Registri di sistema |
| Traduzione NEON | rosetta_trans_neon.c | Operazioni SIMD/NEON |
| Operazioni SIMD | rosetta_simd.h/.c, rosetta_simd_mem.h/.c | Operazioni SIMD |
| Operazioni vettoriali | rosetta_vector.h/.c | Operazioni vettoriali |
| Traduzione FP | rosetta_fp_translate.h/.c, rosetta_fp_helpers.h/.c | Virgola mobile |
| Emissione JIT | rosetta_jit_emit.h/.c, rosetta_jit_emit_simd.h/.c | Emissione JIT |
| Syscall | rosetta_syscalls.h/.c, rosetta_syscalls_impl.h/.c | Gestione syscall |
| Crittografia | rosetta_crypto.h/.c | AES, SHA, CRC32 |
| Contesto | rosetta_context.h/.c | Salvataggio/ripristino contesto CPU |
| Runtime | rosetta_runtime.h/.c | Punto di ingresso runtime |
| Gestione memoria | rosetta_memmgmt.h/.c | Gestione della memoria |
| Utilità | rosetta_utils.h/.c, rosetta_string_utils.h/.c | Funzioni di utilità |
| Categoria | Istruzioni |
|---|
| ALU | ADD, SUB, AND, OR, XOR, MUL, DIV, INC, DEC, NEG, NOT, SHL, SHR, SAR, ROL, ROR |
| Memoria | MOV, MOVZX, MOVSX, MOVSXD, LEA, PUSH, POP, CMP, TEST |
| Branch | Jcc, JMP, CALL, RET, CMOVcc, SETcc, XCHG |
| Bit | BSF, BSR, POPCNT, BT, BTS, BTR, BTC |
| Stringa | MOVS, STOS, LODS, CMPS, SCAS |
| Speciale | CPUID, RDTSC, SHLD, SHRD, CWD, CDQ, CQO, CLI, STI, NOP |
| SIMD | SSE, SSE2, SSE3, SSSE3, SSE4.x |
| FP | x87, SSE scalar FP |
| Crittografia | AES-NI, SHA, CRC32 |
| Sessione | Focus | File creati/modificati |
|---|
| 61+ | Modularizzazione completa | 35+ componenti modulari |
| 61 | Modularizzazione della traduzione | 6 moduli di traduzione + miglioramenti x86_decode |
| 60 | Infrastruttura di traduzione | implementazione core di translate_block() |
| 59 | Implementazione syscall | Gestori syscall aggiuntivi |
| 58 | Traduzione syscall | Gestori I/O vettoriali e di rete |
| 57 | Gestione memoria | Miglioramenti del tracker allocazione VM |
| 56 | Operazioni SIMD | Traduzioni SIMD avanzate |
| 55 | FP/SIMD | Traduzione istruzioni a virgola mobile |
| 54 | Estensioni crittografiche | Implementazione pass-through AES-NI |
| 53 | Estensioni crittografiche | Istruzioni SHA e CRC32 |
| 52 | Operazioni su stringhe | Funzioni stringa ottimizzate con SIMD |
| 51 | Operazioni vettoriali | Aritmetica vettoriale NEON |
| 50 | Conversioni vettoriali | Conversioni a virgola mobile |
| 49 | Cache di traduzione | Gestione cache AOT/JIT |
| 48 | Core JIT | Infrastruttura di compilazione JIT |
| 46-47 | Generazione codice | Helper di generazione codice x86_64 |
| 45 | Helper di decodifica | Utility di decodifica ARM64 |