
KI-gestütztes Reverse-Engineering von Rosetta (2 für Linux). Haftungsausschluss: Aufgrund der Nutzungsvereinbarung werde ich den Code nicht anfassen. Alles wird von KI erledigt, daher könnte die Implementierung chaotisch sein.
Ein umfassendes Reverse-Engineering-Projekt zum Verständnis und zur Dokumentation von Apples Rosetta 2-Binärübersetzungstechnologie.
Im November 2020 kündigte Apple seine ersten Apple-Silicon-Macs an, was einen historischen Übergang von Intel-x86_64-Prozessoren zu den eigenen ARM-basierten M1-Chips markierte. Dies war Apples dritter großer Architekturwechsel:
Jeder Übergang erforderte eine Binärübersetzungslösung, um vorhandene Software während der Migrationsphase ausführen zu können. Rosetta 2 ist Apples bisher ausgeklügeltstes Binärübersetzungssystem.
Rosetta (2006-2011) war Apples erste dynamische Binärübersetzungssoftware, die es PowerPC-Anwendungen ermöglichte, auf Intel-basierten Macs zu laufen.
Rosetta wurde in Mac OS X 10.7 (Lion) entfernt, womit der Intel-Übergang abgeschlossen wurde.
Rosetta 2 ist Apples fortschrittliche dynamische Binärübersetzungstechnologie, die es Anwendungen, die für Intel x86_64 Macs kompiliert wurden, ermöglicht, auf Apple Silicon (ARM64) Macs zu laufen.
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Schlüsseltechnologien
1. **Vorausschauende (AOT) Übersetzung**
- Übersetzt x86_64-Binärdateien zur Installationszeit in ARM64
- Speichert übersetzten Code in einem Cache für schnellere nachfolgende Starts
- Reduziert Laufzeit-Overhead im Vergleich zu reiner JIT-Übersetzung
2. **Just-in-Time (JIT) Übersetzung**
- Übersetzt Codeblöcke bedarfsgesteuert während der Ausführung
- Behandelt dynamisch geladenen Code und selbstmodifizierenden Code
- Verwaltet Übersetzungs-Cache für Effizienz
3. **Befehlssatzübersetzung**
- x86_64 -> ARM64 Befehlszuordnung
- SSE/AVX -> NEON Vektorbefehlsübersetzung
- x86_64 Flags -> ARM64 Bedingungscodes
4. **Systemaufrufübersetzung**
- Übersetzt x86_64 macOS-Systemaufrufe in ARM64-Äquivalente
- Behandelt unterschiedliche Aufrufkonventionen
- Verwaltet Registerzustand über Systemaufrufgrenzen hinweg
5. **Laufzeitunterstützung**
- CPU-Funktionserkennungsemulation
- Thread-lokale Speicherverwaltung
- Signal- und Ausnahmebehandlung
---
## Wie Apple Rosetta 2 in macOS bereitstellt
### Installationsort
Rosetta 2 befindet sich unter:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
Das Verzeichnis oah steht für "Old Architecture Hardware" – eine Fortführung aus der PowerPC-Übergangszeit.
Auf Apple Silicon Macs ist Rosetta 2 standardmäßig nicht installiert. Es wird auf zwei Arten ausgelöst:
┌──────────────────────────────────────────────────────────────────┐ │ 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 │ └──────────────────────────────────────────────────────────────────┘
### Wichtige Übersetzungsherausforderungen
1. **Registerzuordnung**
- x86_64 hat 16 GPRs; ARM64 hat 31 GPRs
- x86_64 Flags-Register -> ARM64 NZCV-Flags
- RIP (Instruction Pointer) Emulation
2. **Speicherordnung**
- x86_64: Starke Speicherordnung (TSO)
- ARM64: Schwache Speicherordnung
- Erfordert Speicherbarrieren für Korrektheit
3. **Vektorbefehle**
- SSE (128-Bit) -> NEON (128-Bit) direkte Zuordnung
- AVX (256-Bit) -> NEON-Paar-Emulation
- Unterschiedliche Ausnahmebehandlung für SIMD
4. **Aufrufkonventionen**
- x86_64: Erste 6 Argumente in Registern (RDI, RSI, RDX, RCX, R8, R9)
- ARM64: Erste 8 Argumente in Registern (X0-X7)
- Unterschiedliche Stack-Frame-Layouts
---
## Dieses Projekt
Dieses Repository enthält reverse-engineerte Implementierungen von Funktionen aus den Rosetta 2-Binärdateien. Durch sorgfältige Analyse und Dekompilierung haben wir den semantischen Zweck von Hunderten von Funktionen identifiziert und dokumentiert.
### Ziele
1. **Bildungszweck**: Verstehen, wie Rosetta 2 intern funktioniert
2. **Dokumentation**: Umfassende Dokumentation der Übersetzungstechniken erstellen
3. **Implementierung**: Saubere, gut dokumentierte C-Implementierungen bereitstellen
4. **Community**: Wissen mit der Reverse-Engineering-Community teilen
### Was wir erreicht haben
- **828 Funktionen** in der Haupt-`rosetta`-Binärdatei identifiziert und benannt
- **612 Funktionen** vollständig mit sauberem C-Code implementiert
- **66 Kategorien** von Funktionalitäten dokumentiert
- Vollständige Funktionsnamenszuordnungen mit semantischen Namen
### Kategorien von Funktionen
| Kategorie | Funktionen | Beschreibung |
|-----------|------------|--------------|
| Einstiegspunkt | 1 | Rosetta-Initialisierung |
| FP/Vektor-Operationen | ~20 | Fließkomma- und SIMD-Zustandsverwaltung |
| SIMD-Speicheroperationen | ~10 | memchr, memcmp, memcpy mit SIMD |
| Vektoroperationen | ~30 | NEON-Vektorarithmetik, Vergleich |
| Binärübersetzung | ~50 | x86_64 -> ARM64 Befehlsübersetzung |
| Syscall-Handler | ~60 | Systemaufruf-Übersetzung und -Weiterleitung |
| Speicherverwaltung | ~20 | malloc, free, mmap-Wrapper |
| Hash-Funktionen | ~5 | Adress-Hashing für Übersetzungs-Cache |
| Zeichenkettenoperationen | ~30 | SIMD-optimierte String-Funktionen |
| Kryptografische Erweiterungen | ~30 | AES, SHA, CRC32-Durchleitung |
| ELF-Parsing | ~15 | Linux-Binärformatunterstützung |
| Übersetzungs-Cache | ~20 | AOT/JIT-Cache-Verwaltung |
---
## Dateistruktur
### Kern-Dateien```
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)
Die Übersetzungsinfrastruktur ist vollständig modularisiert in kategorisierte Komponenten:``` ├── 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
### Funktionsmodule
Kerninfrastruktur- und Unterstützungsmodule:```
├── 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
├── 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
### Syscall-Module
Gast-Syscall-Behandlung und -Übersetzung:```
├── rosetta_syscalls.h/.c # Syscall translation core
├── rosetta_syscalls_impl.h/.c # Syscall implementations
└── rosetta_crypto.h/.c # Crypto instructions (AES, SHA, CRC32)
Zusätzliche Übersetzungs- und Unterstützungsmodule:``` ├── 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
### Testdateien```
├── test_jit.c # JIT unit tests (737 lines)
└── test_translate.c # Translation tests (1,059 lines)
Gesamt: 50+ Quelldateien, ~150,000+ Codezeilen
make -f Makefile.modular all
### Erstellen einzelner Komponenten```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
### Verwendung als Bibliothek```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
Die ursprüngliche dekompilierte Datei rosetta_decomp.c enthält Zeichenfolgenliterale, die die Struktur des ursprünglichen Quellcodes offenlegen. Diese Dateinamen erscheinen in Assertions-/Fehlermeldungen im gesamten Binärprogramm.
Hinweis: Der umgestaltete Code verwendet eine andere, modularere Struktur als das Original.
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.hppDie Übersetzungsinfrastruktur ist vollständig in folgende Komponenten modularisiert:
Gesamt: 40+ modulare Komponenten
Dieses Projekt dient ausschließlich Bildungs- und Forschungszwecken.
MIT-Lizenz - Siehe LICENSE-Datei für Details.
Beiträge sind willkommen! Interessensgebiete:
Zuletzt aktualisiert: Februar 2026
| Komponente | Beschreibung |
|---|
RosettaLinux/rosetta | ARM64-Binärdatei mit Übersetzungs-Engine |
RosettaLinux/rosettad | System-Daemon zur Verwaltung von Übersetzungsdiensten |
debugserver -> /usr/libexec/rosetta/debugserver | Debugging-Unterstützung für übersetzte Prozesse |
libRosettaRuntime | Laufzeitbibliothek, die während der Übersetzung verlinkt wird |
translate_tool -> /usr/libexec/rosetta/translate_tool | Übersetzungswerkzeug zum Erstellen übersetzter Binärdateien |
Vdso.cppProcMapsParser.cppThreadContextSignals.cppThreadContextSyscalls.cppTranslationCacheAot.cppTranslationCacheJit.cppTranslationCache.cppTranslator.cppRuntimeLibraryBridgeInternal.cppTwoLevelOffsetMap.cppDeltaCodedOffsetMap.cpp| Metrik | Wert |
|---|
| Anzahl Funktionen | 828 |
| Zugeordnete Funktionen | 828 (100%) |
| Implementierte Funktionen | 600+ |
| Abschluss | ~75% |
| Dokumentierte Kategorien | 66 |
| Quelldateien | 56 C + 65 H |
| Gesamte Codezeilen | ~150.000+ |
| Modulkategorie | Dateien | Beschreibung |
|---|
| Kern-Typen | rosetta_types.h | Basis-Typdefinitionen |
| Ausführungs-Engine | rosetta_exec.h/.c | execute_translated, Kontextwechsel |
| Initialisierung | rosetta_init.h/.c | init_translation_env, FP-Register |
| x86-Dekodierung | rosetta_x86_decode.h/.c | x86_64-Befehlsdekodierer |
| ARM64-Emission | rosetta_arm64_emit.h/.c | ARM64-Codeemission |
| Codegenerierung | rosetta_codegen.h/.c | Codegenerierungs-Primitive |
| JIT-Kern | rosetta_jit.h/.c | JIT-Kompilierungsinfrastruktur |
| Übersetzungs-Cache | rosetta_cache.h/.c, rosetta_transcache.h/.c | Block-Caching (AOT/JIT) |
| Blockübersetzung | rosetta_translate_block.h/.c | Basisblock-Übersetzung |
| Befehlsverteilung | rosetta_trans_dispatch.h/.c | Befehlsverteilung |
| ALU-Übersetzung | rosetta_translate_alu.h/.c, rosetta_trans_alu.h/.c | Arithmetik-/Logikoperationen |
| Speicherübersetzung | rosetta_translate_memory.h/.c, rosetta_trans_mem.h/.c | Lade-/Speicher-Operationen |
| Sprungübersetzung | rosetta_translate_branch.h/.c, rosetta_trans_branch.h/.c | Kontrollfluss |
| Bit-Übersetzung | rosetta_translate_bit.h/.c, rosetta_trans_bit.h/.c | Bit-Manipulation |
| String-Übersetzung | rosetta_translate_string.h/.c, rosetta_trans_string.h/.c | String-Operationen |
| Spezialübersetzung | rosetta_translate_special.h/.c, rosetta_trans_special.h/.c | Spezialbefehle |
| Systemübersetzung | rosetta_trans_system.h/.c | Systemregister |
| NEON-Übersetzung | rosetta_trans_neon.c | SIMD/NEON-Operationen |
| SIMD-Ops | rosetta_simd.h/.c, rosetta_simd_mem.h/.c | SIMD-Operationen |
| Vektor-Ops | rosetta_vector.h/.c | Vektor-Operationen |
| FP-Übersetzung | rosetta_fp_translate.h/.c, rosetta_fp_helpers.h/.c | Gleitkomma |
| JIT-Emission | rosetta_jit_emit.h/.c, rosetta_jit_emit_simd.h/.c | JIT-Emission |
| Syscalls | rosetta_syscalls.h/.c, rosetta_syscalls_impl.h/.c | Syscall-Behandlung |
| Kryptografie | rosetta_crypto.h/.c | AES, SHA, CRC32 |
| Kontext | rosetta_context.h/.c | CPU-Kontext speichern/wiederherstellen |
| Laufzeit | rosetta_runtime.h/.c | Laufzeit-Einstiegspunkt |
| Speicherverwaltung | rosetta_memmgmt.h/.c | Speicherverwaltung |
| Dienstprogramme | rosetta_utils.h/.c, rosetta_string_utils.h/.c | Hilfsfunktionen |
| Kategorie | Anweisungen |
|---|
| ALU | ADD, SUB, AND, OR, XOR, MUL, DIV, INC, DEC, NEG, NOT, SHL, SHR, SAR, ROL, ROR |
| Speicher | MOV, MOVZX, MOVSX, MOVSXD, LEA, PUSH, POP, CMP, TEST |
| Sprünge | Jcc, JMP, CALL, RET, CMOVcc, SETcc, XCHG |
| Bit | BSF, BSR, POPCNT, BT, BTS, BTR, BTC |
| String | MOVS, STOS, LODS, CMPS, SCAS |
| Spezial | CPUID, RDTSC, SHLD, SHRD, CWD, CDQ, CQO, CLI, STI, NOP |
| SIMD | SSE, SSE2, SSE3, SSSE3, SSE4.x |
| FP | x87, SSE Skalar-FP |
| Krypto | AES-NI, SHA, CRC32 |
| Sitzung | Schwerpunkt | Erstellte/Geänderte Dateien |
|---|
| 61+ | Vollständige Modularisierung | 35+ modulare Komponenten |
| 61 | Übersetzungsmodularisierung | 6 Übersetzungsmodule + x86_decode-Erweiterungen |
| 60 | Übersetzungsinfrastruktur | translate_block() Kernimplementierung |
| 59 | Syscall-Implementierung | Zusätzliche Syscall-Handler |
| 58 | Syscall-Übersetzung | I/O-Vektor- und Netzwerk-Handler |
| 57 | Speicherverwaltung | VM-Allokationsverfolgung verbessert |
| 56 | SIMD-Operationen | Erweiterte SIMD-Übersetzungen |
| 55 | FP/SIMD | Gleitkomma-Befehlsübersetzung |
| 54 | Krypto-Erweiterungen | AES-NI-Durchleitungsimplementierung |
| 53 | Krypto-Erweiterungen | SHA- und CRC32-Befehle |
| 52 | String-Operationen | SIMD-optimierte String-Funktionen |
| 51 | Vektor-Operationen | NEON-Vektor-Arithmetik |
| 50 | Vektor-Konvertierungen | Gleitkomma-Konvertierungen |
| 49 | Übersetzungs-Cache | AOT/JIT-Cache-Verwaltung |
| 48 | JIT-Kern | JIT-Kompilierungsinfrastruktur |
| 46-47 | Codegenerierung | x86_64-Codegenerierungs-Hilfsfunktionen |
| 45 | Dekodierungs-Hilfsfunktionen | ARM64-Dekodierungs-Dienstprogramme |