
Reverse engineering assisté par IA de Rosetta (2 pour Linux). Avertissement : en raison de l'accord d'utilisation, je ne toucherai pas au code. Tout est fait par l'IA, donc l'implémentation pourrait être brouillonne.
Un effort complet de rétro-ingénierie pour comprendre et documenter la technologie de traduction binaire Rosetta 2 d'Apple.
En novembre 2020, Apple a annoncé leurs premiers Mac Apple Silicon, marquant une transition historique des processeurs Intel x86_64 vers leurs propres puces M1 basées sur ARM. Il s'agissait de la troisième transition majeure d'architecture d'Apple :
Chaque transition a nécessité une solution de traduction binaire pour faire fonctionner les logiciels existants pendant la période de migration. Rosetta 2 est le système de traduction binaire le plus sophistiqué d'Apple à ce jour.
Rosetta (2006-2011) était le premier logiciel de traduction binaire dynamique d'Apple, permettant aux applications PowerPC de fonctionner sur les Mac Intel.
Rosetta a été supprimée dans Mac OS X 10.7 (Lion), achevant la transition Intel.
Rosetta 2 est la technologie avancée de traduction binaire dynamique d'Apple qui permet aux applications compilées pour les Mac Intel x86_64 de fonctionner sur les Mac Apple Silicon (ARM64).
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Technologies clés
1. **Traduction Ahead-of-Time (AOT)**
- Traduit les binaires x86_64 en ARM64 lors de l'installation
- Stocke le code traduit dans un cache pour des lancements ultérieurs plus rapides
- Réduit la surcharge d'exécution par rapport à la traduction JIT pure
2. **Traduction Just-in-Time (JIT)**
- Traduit les blocs de code à la demande pendant l'exécution
- Gère le code chargé dynamiquement et le code auto-modifiant
- Maintient un cache de traduction pour l'efficacité
3. **Traduction du jeu d'instructions**
- Correspondance des instructions x86_64 -> ARM64
- Traduction des instructions vectorielles SSE/AVX -> NEON
- Drapeaux x86_64 -> codes de condition ARM64
4. **Traduction des appels système**
- Traduit les appels système macOS x86_64 en équivalents ARM64
- Gère les différentes conventions d'appel
- Gère l'état des registres entre les appels système
5. **Prise en charge de l'exécution**
- Émulation de la détection des fonctionnalités du processeur
- Gestion du stockage local de thread
- Gestion des signaux et des exceptions
---
## Comment Apple livre Rosetta 2 dans macOS
### Emplacement de l'installation
Rosetta 2 se trouve à :```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
Le répertoire oah signifie "Old Architecture Hardware" - une continuité de l'époque de la transition PowerPC.
Sur les Mac Apple Silicon, Rosetta 2 n'est pas installé par défaut. Il est déclenché de deux manières :
| Composant | Description |
|---|---|
RosettaLinux/rosetta | Binaire ARM64 principal contenant le moteur de traduction |
RosettaLinux/rosettad | Daemon système gérant les services de traduction |
debugserver -> /usr/libexec/rosetta/debugserver | Support de débogage pour les processus traduits |
libRosettaRuntime | Bibliothèque d'exécution liée lors de la traduction |
translate_tool -> /usr/libexec/rosetta/translate_tool | Outil de traduction pour construire des binaires traduits |
┌──────────────────────────────────────────────────────────────────┐ │ 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 │ └──────────────────────────────────────────────────────────────────┘
### Défis Clés de la Traduction