Présentation
Le 5 octobre, le projet mold a publié la version 3.0.0, marquant la première édition du linker haute vitesse écrite en Rust. Cette version succède à la 2.42.1, dernière en C++, et se veut compatible à 100 % avec les options de ligne de commande, les architectures cibles et les sorties attendues, à l’exception des corrections de bugs détaillées plus bas.
Réécriture en Rust et implications de sécurité
Le code source a été migré de C++ vers Rust, nécessitant Rust 1.95 ou supérieur et un compilateur C pour les dépendances natives. La réécriture introduit un contrôle de limites sur les lectures de fichiers d’entrée ; ainsi, les accès hors limites qui provoquaient auparavant un segmentation fault se traduisent maintenant par une panic explicite, limitant les plantages non contrôlés. Cette amélioration repose sur le modèle de sécurité de Rust, qui impose la vérification à la compilation et à l’exécution des accès mémoire.
Compatibilité, performances et validation
Pour garantir l’équivalence fonctionnelle, les développeurs ont exécuté la suite de tests sur chaque cible prise en charge, comparé les sorties du linker sur un large éventail de charges de travail réelles et reconstruit l’ensemble des paquets Gentoo. Aucun régression n’a été détectée, et les performances de liaison restent « on par avec » la version 2.42.1, selon les mesures internes. Le projet vise également à combler les derniers écarts de compatibilité avec GNU ld, notamment le support complet des scripts de linker.
Modifications du système de construction et correctifs majeurs
Le processus de compilation a été simplifié :
cargo build --release
./install-mold.sh remplace les précédents appels à CMake. Les options CMake ont disparu, remplacées par des features Cargo (ex. MOLD_TARGETS devient un ensemble de features). Le linker intègre toujours mimalloc 3.5.3 en liaison statique, mais il est possible d’utiliser l’allocation système via --features system-allocator. Les bibliothèques zlib, zstd et BLAKE3 sont liées dynamiquement si disponibles, avec la variable d’environnement ZSTD_SYS_USE_PKG_CONFIG=1 pour forcer l’usage du paquet système.Parmi les correctifs, on compte : la suppression du crash lors de la création d’exécutables statiques avec --default-symver, la prise en charge correcte de --gc-sections pour les symboles --init et --fini, la résolution précise des symboles communs de tailles différentes, et la gestion fiable des relocations GOT‑relative (R_X86_64_GOTOFF64, R_ARM_REL32). Les erreurs de relocations PC‑relative sont désormais explicites, facilitant le diagnostic.