Rui Ueyama, autor kompilatora LLVM lld i kompilatora chibicc, zaprezentował pierwszą stabilną wersję nowego, wysokowydajnego łącznika Mold, który znacznie przewyższa prędkością łączenie plików obiektowych łączniki GNU gold i LLVM lld. Projekt uznano za gotowy do wdrożeń komercyjnych i może być stosowany jako szybsza, przezroczysta alternatywa dla GNU linker na systemach Linux. W planach na następne istotne wydanie znajduje się doprowadzenie do gotowości wsparcia platformy macOS, po czym rozpoczną się prace nad dostosowaniem Mold dla Windows.
Mold jest napisany w języku C++ (C++20) i jest dystrybuowany na licencji AGPLv3, która jest zgodna z GPLv3, ale nie jest zgodna z GPLv2, ponieważ wymaga ujawnienia zmian w trakcie opracowywania usług sieciowych. Taki wybór jest spowodowany chęcią pozyskania finansowania na rozwój — autor jest gotów sprzedać prawa do kodu w celu ponownej licencji na licencji zezwalającej, takiej jak MIT, lub oferować osobną komercyjną licencję dla tych, którzy nie akceptują AGPL.
Mold obsługuje wszystkie funkcje GNU linker i charakteryzuje się bardzo wysoką wydajnością — łączenie odbywa się z prędkością tylko dwa razy wolniej niż zwykłe kopiowanie plików za pomocą narzędzia cp. Na przykład, podczas kompilacji Chrome 96 (o wielkości kodu 1.89 GB) łączenie plików wykonywalnych z debuginfo na ośmiordzeniowym komputerze przy użyciu GNU gold zajmuje 53 sekundy, LLVM lld — 11.7 sekund, a Mold zaledwie 2.2 sekundy (26 razy szybciej niż GNU gold). Podczas łączenia Clang 13 (3.18 GB) w GNU gold potrzebnych jest 64 sekundy, w LLVM lld — 5.8 sekund, a w Mold — 2.9 sekundy. Przy łączeniu Firefox 89 (1.64 GB) w GNU gold wymagana jest 32.9 sekundy, w LLVM lld — 6.8 sekund, a w Mold — 1.4 sekundy.

Skrócenie czasu łączenia pozwala znacznie zwiększyć wygodę pracy nad dużymi projektami poprzez skrócenie czasu oczekiwania podczas tworzenia plików wykonywalnych w trakcie debugowania i testowania zmian. Motywem stworzenia Mold było rozdrażnienie spowodowane koniecznością oczekiwania na zakończenie łączenia po każdej zmianie w kodzie, a także niska efektywność istniejących łączników na systemach wielordzeniowych i chęć przetestowania zasadniczo innej architektury łączenia, bez uciekania się do nadmiernie skomplikowanych modeli, takich jak łączenie inkrementalne.
Wysoka wydajność kompilacji pliku wykonywalnego z wielu przygotowanych przez kompilator plików obiektowych w Mold osiągana jest dzięki zastosowaniu szybszych algorytmów, aktywnemu równoległemu przetwarzaniu operacji między dostępnymi rdzeniami CPU oraz wykorzystaniu efektywniejszych struktur danych. Na przykład w Mold zastosowano technikę wykonywania intensywnych obliczeń jednocześnie z kopiowaniem plików, wstępnym ładowaniem plików obiektowych do pamięci, wykorzystaniem szybkich tabel haszujących przy rozwiązywaniu symboli, skanowaniem tabel przemieszczeń w oddzielnym wątku oraz deduplikacją powtarzających się w różnych plikach sekcji łączonych.
Źródło: opennet.ru
