Concept : Les Trampolines Binaires Rust
Navigation : Documentation > Trampolines
Spécification technique détaillée : 02. Routage des Binaires & Trampolines
Code source :tools/trampoline/src/main.rs
Sommaire
- La Problématique des Shims Traditionnels
- La Solution Érable : Le Trampoline Rust Universel
- Fonctionnement des Fichiers Pointeurs
.target - Sécurité et Confinement Intégrés
- Maintenance et Commande
update-trampolines - Comparatif Technique
- Liens et Références Associées
1. La Problématique des Shims Traditionnels
Pour exposer des exécutables situés dans des dossiers versionnés profonds sans polluer la variable globale PATH avec des centaines d'entrées, les gestionnaires de paquets utilisent généralement des mécanismes intermédiaires :
- Les scripts wrappers shell (
.cmd,.bat,.ps1) : - Lenteur notable : chaque invocation déclenche un interpréteur (
cmd.exeoupowershell.exe) avec un surcoût de 50 à 250 ms par appel. - Rupture d'environnement : ils cassent la variable
%~dp0, ce qui paralyse les gestionnaires d'outils commenpm,npxoupip. - Problèmes d'échappement d'arguments et de transmission des signaux d'arrêt (Ctrl+C).
- Les liens symboliques (Symlinks) :
- Sous Windows, la création de liens symboliques exige des privilèges Administrateur ou l'activation du Developer Mode.
- Risques de sécurité de type Symlink Traversal.
2. La Solution Érable : Le Trampoline Rust Universel
Érable élimine totalement les wrappers shell et les liens symboliques privilégiés en introduisant un Trampoline Binaire Natif en Rust :
flowchart LR
A["Utilisateur / Script<br><code>rg --files</code>"] --> B["~/.erable/bin/rg.exe<br><b>Trampoline Rust (25 Ko)</b>"]
B --> C["Lecture atomique de<br><code>rg.exe.target</code>"]
C --> D["Exécution directe du binaire cible :<br><code>packages/ripgrep/current/rg.exe</code>"]
- Empreinte ultra-légère : Binaire autonome de seulement 25 à 30 Ko, compilé avec LTO (Link-Time Optimization) et suppression des symboles inutiles.
- Performances extrêmes :
- Sur POSIX (Linux, macOS) :
execvpremplace directement l'image mémoire du processus (surcoût de 0 ms). - Sous Windows : Délégation directe de bas niveau (
CreateProcessW) avec surcoût d'à peine ~1 ms. - Support universel des types de cibles :
- Binaires natifs (
.exe, ELF, Mach-O). - Scripts Nushell (
.nu) : routés automatiquement vers le moteur Nushell interne local (~/.erable/tools/nu/). - Scripts batch (
.cmd,.bat) et PowerShell (.ps1).
3. Fonctionnement des Fichiers Pointeurs .target
Pour chaque exécutable exposé dans ~/.erable/bin/, Érable déploie deux éléments :
- Le binaire Trampoline (ex:
bin/kubectl.exesous Windows, oubin/kubectlsous Linux). - Le fichier compagnon pointeur (ex:
bin/kubectl.exe.targetoubin/kubectl.target).
Le fichier .target est un fichier texte simple contenant uniquement le chemin absolu vers l'exécutable réel :
Avantages majeurs :
- Mises à jour atomiques : Changer la version active d'un outil consiste simplement à réécrire la ligne du fichier
.target. L'opération est instantanée et n'entraîne aucun verrouillage de binaire. - Zéro recompilation : Le binaire
kubectl.exeest une copie directe du trampoline de référence local. Aucun code n'est compilé lors de l'installation d'un paquet.
4. Sécurité et Confinement Intégrés
Le code source du trampoline (tools/trampoline/src/main.rs) intègre des gardes-fous stricts :
- Confinement dans l'espace Érable : Le trampoline vérifie que le chemin cible résolu dans le
.targetse situe impérativement à l'intérieur du répertoire racine~/.erable. Toute tentative de pointer vers un binaire externe arbitraire est rejetée. - Protection Anti-DLL Hijacking : Le trampoline s'exécute avec les flags de sécurité Windows désactivant la recherche de DLLs dans le répertoire de travail non sécurisé.
- Transmission fidèle des flux et codes de sortie : Les codes d'erreur (
exit_code), les fluxstdin,stdoutetstderrsont transmis sans altération.
5. Maintenance et Commande update-trampolines
Tous les trampolines présents dans ~/.erable/bin/ proviennent d'une référence locale unique stockée dans ~/.erable/tools/trampoline(.exe).
Lorsqu'une nouvelle version du trampoline est publiée ou recompilée localement :
Cette commande met à jour en masse l'ensemble des exécutables du dossier bin/ par copie locale instantanée, en préservant tous les fichiers .target existants.
6. Comparatif Technique
| Critère | Wrapper Shell (.cmd/.ps1) |
Lien Symbolique (Symlink) | Trampoline Rust Érable |
|---|---|---|---|
| Surcoût au lancement | 50 ms à 250 ms | 0 ms | < 1 ms (Win) / 0 ms (POSIX) |
| Droits requis (Windows) | Utilisateur standard | Droits Administrateur / Dev Mode | Utilisateur standard |
Préservation de %~dp0 |
❌ Souvent altéré | ✅ Préservé | ✅ Préservé |
| Gestion des signaux (Ctrl+C) | ❌ Interrompt avec prompt (O/N) |
✅ Directe | ✅ Transmis proprement |
| Taille disque | ~1 Ko | 0 Ko | ~25 Ko |
| Compatibilité WDAC | ❌ Dépend de la politique script | Variable | ✅ Re-signable Authenticode |