Aller au contenu

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

  1. La Problématique des Shims Traditionnels
  2. La Solution Érable : Le Trampoline Rust Universel
  3. Fonctionnement des Fichiers Pointeurs .target
  4. Sécurité et Confinement Intégrés
  5. Maintenance et Commande update-trampolines
  6. Comparatif Technique
  7. 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.exe ou powershell.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 comme npm, npx ou pip.
  • 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) : execvp remplace 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 :

  1. Le binaire Trampoline (ex: bin/kubectl.exe sous Windows, ou bin/kubectl sous Linux).
  2. Le fichier compagnon pointeur (ex: bin/kubectl.exe.target ou bin/kubectl.target).

Le fichier .target est un fichier texte simple contenant uniquement le chemin absolu vers l'exécutable réel :

C:\Users\Olivier\.erable\packages\kubectl\current\kubectl.exe

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.exe est 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 :

  1. Confinement dans l'espace Érable : Le trampoline vérifie que le chemin cible résolu dans le .target se situe impérativement à l'intérieur du répertoire racine ~/.erable. Toute tentative de pointer vers un binaire externe arbitraire est rejetée.
  2. 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é.
  3. Transmission fidèle des flux et codes de sortie : Les codes d'erreur (exit_code), les flux stdin, stdout et stderr sont 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 :

erable update-trampolines

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

7. Liens et Références Associées