Se ha publicado la versión 3.0 del enlazador Mold, que se puede utilizar como un reemplazo transparente y más rápido del enlazador GNU en sistemas Linux. El proyecto es desarrollado por Rui Ueyama, el autor del enlazador LLVM lld. La característica clave de Mold es su velocidad de enlace, que supera notablemente a los enlazadores GNU gold y LLVM lld (el enlace en Mold se realiza a una velocidad solo dos veces más lenta que la simple copia de archivos con la herramienta cp). El código está escrito en Rust y se distribuye bajo la licencia MIT.
La reducción del tiempo de enlace permite aumentar significativamente la comodidad del desarrollo de grandes proyectos al acortar la espera durante la creación de archivos ejecutables al depurar y probar cambios. La motivación para crear Mold fue la frustración de tener que esperar a que finalizara el enlace después de cada cambio en el código, así como la baja eficiencia de los enlazadores existentes en sistemas multiprocesador y el deseo de probar una arquitectura de enlace fundamentalmente diferente, sin recurrir a modelos innecesariamente complejos, como el enlace incremental.
El alto rendimiento del enlace de un archivo ejecutable a partir de un gran número de archivos objeto preparados por el compilador en Mold se logra mediante el uso de algoritmos más rápidos, la paralelización activa de operaciones entre los núcleos de CPU disponibles y la aplicación de estructuras de datos más eficientes. Por ejemplo, Mold implementa técnicas de ejecución de cálculos intensivos simultáneamente con la copia de archivos, la precarga de archivos objeto en memoria, el uso de tablas hash rápidas al resolver símbolos, el escaneo de tablas de reubicación en un hilo separado y la desduplicación de secciones que se repiten en diferentes archivos.
La rama Mold 3.0 se distingue por la reescritura de la base de código de C++ (C++20) a Rust. Mold 3.0 puede utilizarse como un reemplazo transparente de Mold 2.42.1, la última versión en C++, y soporta todas las opciones y arquitecturas disponibles anteriormente. La transición a Rust ha permitido asegurar el proyecto de posibles problemas al manejar archivos objeto dañados; en situaciones donde la versión en C++ fallaba debido al acceso a áreas de memoria fuera del búfer, la versión en Rust se detiene en la etapa de verificación de límites. El rendimiento de la implementación en Rust se mantiene a la par con la versión en C++.
Además de la migración a Rust, el objetivo clave en el desarrollo de la rama 3.0 fue aumentar la compatibilidad con GNU ld y preparar el proyecto para su uso como enlazador por defecto en distribuciones de Linux. El sistema de construcción ha sido reemplazado de CMake a Cargo, y el sistema de pruebas de ctest a cargo test. La biblioteca oneTBB ha sido eliminada de las dependencias.
Fuente: opennet.ru
