Foi lançado o Mold 3.0, um vinculador que pode ser usado como uma alternativa mais rápida e transparente ao GNU linker em sistemas Linux. O projeto é desenvolvido por Rui Ueyama, autor do vinculador LLVM lld. A principal característica do Mold é a sua altíssima velocidade de vinculação de arquivos objeto, superando significativamente os vinculadores GNU gold e LLVM lld (a vinculação no Mold é realizada a uma velocidade apenas duas vezes mais lenta que a cópia simples de arquivos usando o comando cp). O código é escrito na linguagem Rust e é distribuído sob a licença MIT.
A redução no tempo de vinculação permite aumentar consideravelmente a conveniência no desenvolvimento de grandes projetos, ao reduzir a espera no processo de formação de executáveis durante a depuração e teste de alterações. A motivação para criar o Mold foi a frustração de ter que esperar pela conclusão da vinculação após cada alteração no código, assim como a baixa eficiência dos vinculadores existentes em sistemas multinúcleo e o desejo de experimentar uma arquitetura de vinculação completamente nova, sem recorrer a modelos excessivamente complexos, como a vinculação incremental.
A alta performance do Mold na vinculação de um arquivo executável a partir de um grande número de arquivos objeto preparados pelo compilador é alcançada por meio do uso de algoritmos mais rápidos, ativa paralelização de operações entre os núcleos de CPU disponíveis e a aplicação de estruturas de dados mais eficientes. Por exemplo, o Mold implementa a técnica de realizar cálculos intensivos simultaneamente com a cópia de arquivos, pré-carregando os arquivos objeto na memória, utilizando tabelas hash rápidas para resolução de símbolos, escaneando tabelas de relocação em uma thread separada e deduplicando seções repetidas em diferentes arquivos.
A versão Mold 3.0 é notável pela reescrita da base de código de C++ (C++20) para a linguagem Rust. Mold 3.0 pode ser utilizado como uma substituição transparente do Mold 2.42.1, a última versão em C++, e suporta todas as opções e arquiteturas de destino anteriormente disponíveis. A transição para Rust permitiu proteger o projeto contra problemas potenciais ao processar arquivos objeto corrompidos — em situações onde a versão em C++ falhava devido a acessos fora dos limites da memória, a versão em Rust para quando um erro de verificação de limites é encontrado. O desempenho da implementação em Rust é comparável à versão em C++.
Além da migração para Rust, um dos principais objetivos no desenvolvimento da versão 3.0 foi melhorar a compatibilidade com o GNU ld e preparar o projeto para ser utilizado como o vinculador padrão em distribuições Linux. O sistema de compilação foi substituído de CMake para Cargo, e o sistema de testes de ctest para cargo test. A biblioteca oneTBB foi removida das dependências.
Fonte: opennet.ru
