Rui Ueyama, autore del linker LLVM lld e del compilatore chibicc, ha presentato la prima versione stabile del nuovo linker ad alte prestazioni Mold, che supera notevolmente in velocità il collegamento dei file oggetto rispetto ai linker GNU gold e LLVM lld. Il progetto è considerato pronto per implementazioni lavorative e può essere utilizzato come una sostituzione trasparente e più veloce del linker GNU sui sistemi Linux. Tra i piani per il prossimo importante rilascio c'è l'introduzione del supporto per la piattaforma macOS, dopo di che inizierà il lavoro di adattamento di Mold per Windows.
Mold è scritto in C++ (C++20) e distribuito sotto la licenza AGPLv3, che è compatibile con la GPLv3, ma non con la GPLv2, poiché richiede la divulgazione delle modifiche quando si sviluppano servizi di rete. Questa scelta è spiegata dal desiderio di ottenere finanziamenti per lo sviluppo: l'autore è disposto a vendere i diritti sul codice per un rilascio con licenza permissiva, come MIT, o fornire una licenza commerciale separata per coloro che non sono soddisfatti della AGPL.
Mold supporta tutte le funzionalità del linker GNU e si distingue per l'elevata performance: il collegamento avviene a una velocità solo due volte più lenta della semplice copia dei file con il comando cp. Ad esempio, nel collegamento di Chrome 96 (dimensione del codice 1,89 GB), si impiegano 53 secondi con GNU gold, 11,7 secondi con LLVM lld, e solo 2,2 secondi con Mold (26 volte più veloce di GNU gold). Per il collegamento di Clang 13 (3,18 GB), occorrono 64 secondi con GNU gold, 5,8 secondi con LLVM lld e 2,9 secondi con Mold. Nel collegamento di Firefox 89 (1,64 GB), sono necessari 32,9 secondi con GNU gold, 6,8 secondi con LLVM lld, e 1,4 secondi con Mold.

La riduzione del tempo di collegamento consente di migliorare significativamente la comodità nello sviluppo di grandi progetti grazie a una minore attesa durante la generazione di file eseguibili durante il debug e il test delle modifiche. La motivazione per la creazione di Mold è stata l'irritazione per la necessità di attendere il completamento del collegamento dopo ogni modifica al codice, oltre alla bassa efficienza dei collegatori esistenti su sistemi multicore e la volontà di provare un'architettura di collegamento sostanzialmente diversa, senza ricorrere a modelli eccessivamente complessi, come il collegamento incrementale.
L'alta prestazione del collegamento di un file eseguibile da un gran numero di file oggetto preparati dal compilatore in Mold viene raggiunta grazie all'uso di algoritmi più veloci, al parallelismo attivo delle operazioni tra i core CPU disponibili e all'applicazione di strutture dati più efficienti. Ad esempio, in Mold è implementata una tecnica che esegue calcoli intensivi contemporaneamente alla copia dei file, pre-caricando i file oggetto in memoria, utilizzando hash table veloci per la risoluzione dei simboli, eseguendo la scansione delle tabelle di rilocalizzazione in un thread separato e deduplicando le sezioni ripetute in diversi file.
Fonte: opennet.ru
