Rui Ueyama, autor do linkador LLVM lld e do compilador chibicc, apresentou o primeiro lançamento estável do novo linkador de alto desempenho Mold, que supera significativamente a velocidade de vinculação de arquivos objeto em relação aos linkadores GNU gold e LLVM lld. O projeto é considerado pronto para implementação em produção e pode ser usado como uma substituição transparente mais rápida do linkador GNU em sistemas Linux. Entre os planos para o próximo lançamento significativo, destaca-se a preparação do suporte para a plataforma macOS, após o que começará o trabalho de adaptação do Mold para Windows.
Mold é escrito em C++ (C++20) e é distribuído sob a licença AGPLv3, que é compatível com a GPLv3, mas não com a GPLv2, pois exige a divulgação de modificações ao desenvolver serviços de rede. Essa escolha é explicada pelo desejo de financiar o desenvolvimento — o autor está disposto a vender os direitos do código para re-licenciamento sob uma licença permissiva, como MIT, ou fornecer uma licença comercial separada para aqueles que não aceitam a AGPL.
Mold suporta todas as funcionalidades do linkador GNU e se destaca por sua alta performance — a vinculação é realizada a uma velocidade que é apenas duas vezes mais lenta do que a simples cópia de arquivos usando o utilitário cp. Por exemplo, ao compilar o Chrome 96 (tamanho do código de 1.89 GB) para vincular arquivos executáveis com debuginfo em um computador de 8 núcleos, o GNU gold leva 53 segundos, o LLVM lld — 11.7 segundos, enquanto o Mold leva apenas 2.2 segundos (26 vezes mais rápido que o GNU gold). Ao compilar o Clang 13 (3.18 GB), o GNU gold requer 64 segundos, o LLVM lld — 5.8 segundos, e o Mold — 2.9 segundos. Ao compilar o Firefox 89 (1.64 GB), o GNU gold leva 32.9 segundos, o LLVM lld — 6.8 segundos, enquanto o Mold leva apenas 1.4 segundos.

A redução do tempo de vinculação permite aumentar significativamente a conveniência no desenvolvimento de grandes projetos, reduzindo o tempo de espera no processo de formação de arquivos executáveis durante a depuração e testagem de alterações. O impulso para a criação do Mold foi a frustração com a necessidade de esperar pela conclusão da vinculação após cada modificação no código, além da ineficácia dos linkadores existentes em sistemas de múltiplos núcleos e o desejo de experimentar uma arquitetura de vinculação fundamentalmente diferente, sem recorrer a modelos excessivamente complexos, como a vinculação incremental.
O alto desempenho do linker Mold, que compila a partir de muitos arquivos objeto preparados pelo compilador, é alcançado utilizando algoritmos mais rápidos, paralelização ativa das 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 técnicas que permitem realizar cálculos intensivos simultaneamente à cópia de arquivos, carregamento antecipado de arquivos objeto na memória, uso de tabelas de hash rápidas para resolução de símbolos, varredura de tabelas de relocação em uma thread separada e deduplicação de seções duplicadas em diferentes arquivos.
Fonte: opennet.ru
