Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Programování

Linker mold vyšel po přepsání z C++ do Rustu jako verze 3.0

Rui Ueyama vydal 5. října 2026 mold 3.0.0, první vydání rychlého linkeru napsané v Rustu; poslední verze v C++ nese číslo 2.42.1. Autor ho popisuje jako přímou náhradu se stejnými přepínači, stejnými cílovými architekturami i stejným výkonem. Řada 3.x má dohnat GNU ld v podpoře linkerových skriptů a stát se výchozím linkerem linuxových distribucí.

· 17 zhlédnutí

Linker je druhá fáze překladu. Z objektových souborů poskládá spustitelný program nebo sdílenou knihovnu, a u velkého projektu to umí trvat déle než překlad jednotlivých zdrojů. Přesně na tuhle fázi mířil projekt mold, který v roce 2020 založil Rui Ueyama, původní autor linkeru LLVM lld. Podle vlastního měření projektu ze srpna 2026 linkuje mold v mediánu 4,9krát rychleji než lld a 1,9krát rychleji než linker wild; v produkci se podle téhož textu používá od roku 2021.

5. října 2026 vyšlo vydání 3.0.0 a je to první verze napsaná v Rustu. Vydání 2.42.1 z 11. září je podle jeho poznámek poslední, které vzniklo v C++.

Stránka vydání mold 3.0.0 na GitHubu
Stránka vydání mold 3.0.0 na GitHubu. Oznámení vyšlo 5. října 2026 v 10:23 UTC. Foto: vlastní snímek obrazovky, github.com (snímek obrazovky)

Cargo místo CMake

Kdo si mold staví sám, narazí na změnu hned. Projekt se nově překládá přes Cargo, ne přes CMake, a chce Rust 1.95 nebo novější plus překladač C. Místo volání cmake se pouští cargo build --release a instalaci obstará skript install-mold.sh, který bere proměnné PREFIX a DESTDIR. Volby pro CMake zmizely úplně. Jedna past tam je: když knihovny míří jinam než do $PREFIX/lib, třeba do /usr/lib64, musí se při překladu i při instalaci nastavit proměnná MOLD_LIBDIR, jinak režim mold -run nenajde knihovnu mold-wrapper.so.

Ubyla také závislost na knihovně oneTBB od Intelu, kterou verze v C++ používala na paralelní zpracování; v seznamu závislostí v Cargo.toml je na jejím místě rayon. Alokátor mimalloc 3.5.3 zůstává staticky přilinkovaný jako dřív a vyměnit se dá za systémový přepínačem --features system-allocator. Zlib se bere ze systému, pokud je k dispozici, zstd a BLAKE3 nese mold s sebou.

Z repozitáře zmizelo přes dva a půl tisíce cizích souborů

Jak hluboká ta přestavba je, se dá změřit na obsahu repozitáře. Ve značce 2.42.1 měl adresář third-party 2 835 souborů s cizím kódem. Ve značce 3.0.0 takový adresář není a cizí kód se tahá z registru: soubor Cargo.lock vede 70 balíčků, z nichž 23 jsou vlastní crate projektu, takže zvenčí přibývá 47. Obě čísla jsou vlastní součet nad stromem repozitáře u obou značek.

Dvacet podporovaných architektur dostalo každá vlastní crate v adresáři arch, a komentář v Cargo.toml říká proč: linker je nad cílovou architekturou generický, a instanciovat ho pro všech dvacet cílů v jedné crate drží překladač několik minut na jediném jádře. Spustitelný soubor v adresáři cli pak volání rozděluje mezi ně.

Z C zbyly v repozitáři dva soubory, mold-wrapper.c a lto-message.c, dohromady 4 129 bajtů. Jazyková statistika, kterou o repozitáři vede GitHub, uvádí Rust 1 745 951 bajtů, shellové skripty 478 085 a C ty čtyři kilobajty; C++ v ní není vůbec. Testovací sada přitom shellová zůstala – v adresáři tests leží 646 skriptů, jen je místo ctest pouští cargo test.

Místo čtení cizí paměti panika

Jednu změnu chování přinesl jazyk sám. U poškozeného vstupního souboru mohla verze v C++ podle poznámek k vydání číst za hranice pole a skončit segmentační chybou. Ve 3.0 jsou ta čtení hlídaná a mold se zastaví panikou přímo v místě vadného přístupu. Program tedy skončí tak jako tak; rozdíl je v tom, že se do něj nedostanou data odjinud z paměti a že z hlášení je vidět, kde to prasklo.

Náhrada jedna za jednu, říká vydavatel

mold 3.0 má brát tytéž přepínače, podporovat tytéž cílové architektury a vydávat tentýž výstup až na vyjmenované opravy chyb, a rychlost linkování má zůstat na úrovni 2.42.1. Autor píše, že to ověřil třemi způsoby: testovací sadou na každém podporovaném cíli, porovnáním výstupu linkeru na širokém vzorku reálných úloh a kombinací přepínačů a přeložením všech balíčků distribuce Gentoo. Žádnou regresi prý nenašel. Nezávislé měření k tomu zatím není, jsou to postupy a závěry projektu samého.

Arch to má, Fedora ne

Co z toho uvidí uživatel distribuce, ukazuje balíček Arch Linuxu. Ten má mold 3.0.0-2 ve větvi extra-testing, sestavený 5. října v 9:09 UTC, tedy dřív, než se na GitHubu objevilo oznámení. Stabilní větev extra drží 2.42.1 z 11. září a totéž vydání má i rawhide Fedory.

Seznam závislostí toho balíčku je k přestavbě nezávislý doklad. U 2.42.1 chtěl mold za běhu glibc, libblake3, libstdc++, tbb, zlib a zstd, k sestavení pak cmake, ninju a python. U 3.0.0 zbyly běhové závislosti glibc, libgcc a zlib, a k sestavení stačí git a rust.

Proč Rust a co má přijít po něm

Důvody autor sepsal už v poznámkách k 2.42.1. Argumentuje životností: nástroj, jako je linker, se podle něj vyvíjí s tím, že může zůstat v provozu desítky let, a mold je na tak dlouhou dráhu teprve na začátku. Rust mezitím podle téhož textu dospěl do stavu, kdy nabízí výkon srovnatelný s C++ a k tomu paměťovou bezpečnost. Riziko si autor přiznává a přidává k němu i větu o nástrojích, kterými se dnes takový přepis dělá: pokroky v programování s pomocí umělé inteligence podle něj rozsáhlé přepisy výrazně zpraktičtěly, ale rizika neodstraňují (překlad z anglického originálu).

Hlavní cíl řady 3.x ale není jazyk. Je jím podpora linkerových skriptů natolik úplná, aby mold uměl slinkovat nejen běžné programy, ale i jádra a firmware – a potom domluva s vývojáři distribucí, aby ho šlo nasadit jako systémový /usr/bin/ld. Ueyama v poznámkách píše, že za dvacet let vzniklo několik rychlých linkerů včetně gold, lld a moldu, a systémovým linkerem na většině distribucí je pořád GNU ld. Hotové to tedy není; 3.0 je k tomu první krok, ne cíl.

Opravy, které s jazykem nesouvisejí

Vedle přepisu nese vydání dlouhý seznam oprav. Na architekturách AArch64, PPC32 a ARM32 skákaly přemosťovací skoky na statické funkce v jiných sekcích na špatné adresy, což se projevovalo u velkých programů – poznámky jmenují ladicí sestavení Chromia pro ARM64. Relokace vztažené k tabulce GOT proti symbolům definovaným ve sdílené knihovně tiše dostávaly špatné adresy; teď se buď spočítají správně, nebo ohlásí jako chyba.

Přepínače s jednou pomlčkou se nově čtou jako v GNU ld: -entry=main mold do té doby bral jako -e ntry=main. A ještě jedna drobnost, kterou ocení každý, kdo staví v omezeném prostředí: mold si při startu už nerezervuje 8 GiB virtuálního adresního prostoru, takže projde i pod ulimit -v.

Co s tím

Kdo bere mold z distribuce, nemusí dělat nic a ve většině případů se k němu verze 3.0 dostane sama. Kdo si ho staví ve vlastním obrazu nebo v CI, vymění CMake za Cargo a přidá si do sestavovacího prostředí Rust. A jestli mold opravdu nahradí GNU ld v roli systémového linkeru, rozhodnou linkerové skripty, ne jazyk, ve kterém je napsaný.

Zdroje

Programování

Rust mold linker Arch Linux

← zpět na výpis