Mold 3.0.0 ist ein bedeutendes Major-Release des Hochgeschwindigkeits-Linkers, das vollständig von C++ nach Rust portiert wurde; Version 2.42.1 stellt die finale C++-Iteration dar. Als drop-in-Ersatz bietet Version 3.0.0 identische Performance und Architekturkompatibilität, führt jedoch strikte Bereichsprüfungen für erhöhte Speichersicherheit ein und ersetzt das CMake-Buildsystem durch Cargo (Rust 1.95+). Die Neuentwicklung zielt darauf ab, verbleibende GNU-ld-Lücken zu schließen und die Integration als Standard-Linker in Linux-Distributionen zu erleichtern.
Wichtigste Punkte
Vollständiger Rust-Rewrite: Version 3.0.0 ersetzt die gesamte bisherige C++-Codebasis durch Rust; Version 2.42.1 markiert das Ende des C++-Strangs.
Erhöhte Speichersicherheit: Korrupte Eingabedateien führen durch erzwungenes Bounds-Checking nicht mehr zu unkontrollierten Speicherzugriffsfehlern (Segfaults), sondern stoppen kontrolliert per Panic.
Buildsystem-Umstellung: Das Projekt wurde von CMake auf Cargo migriert; vorausgesetzt werden nun Rust 1.95 oder neuer sowie ein C-Compiler (cargo build --release).
Abhängigkeitsänderungen: Die oneTBB-Abhängigkeit wurde entfernt; mimalloc 3.5.3 ist weiterhin statisch integriert, während zlib vom System gelinkt und zstd sowie BLAKE3 direkt eingebunden werden.
Optimierter Speicherbedarf: Mold reserviert beim Systemstart nicht mehr pauschal 8 GiB virtuellen Adressraum, wodurch die Ausführung unter restriktiven ulimit -v-Vorgaben ermöglicht wird.
Architektur- und Plattform-Fixes: Zahlreiche Korrekturen bezüglich Relokationen, Thunks und Symbol-Handling wurden für AArch64, ARM32, RISC-V, LoongArch, PPC32/64, SH4 und SPARC64 implementiert.
Diskussions-Highlights
Bootstrapping-Problematik: Distro-Maintainer (unter anderem von hermetischen Quellcode-Distributionen wie stagex) kritisieren scharf, dass ein in Rust geschriebener Linker nicht mehr als früher C-basierter Bootstrap-Linker in rein quellenbasierten Pipelines verwendet werden kann, da Rust selbst einen Rust-Compiler voraussetzt; dies erzwingt die dauerhafte Weiterpflege eines unoffiziellen C-Forks ("mold2").
KI-Assistierte Entwicklung: Der Autor nutzte moderne LLMs (wie Claude) für die effiziente Portierung der komplexen Codebasis in wenigen Wochen, was in der Community eine breite Debatte über Wartbarkeit und den pragmatischen Nutzen von KI bei Groß-Refactorings auslöste.
Vergleich mit Alternativen: Diskutiert wird auch das alternative Linker-Projekt Wild, das primär auf inkrementelles Linken abzielt, obgleich beide Projekte unterschiedliche Performance- und Architekturprofile aufweisen.
Sprachwahl im Vergleich: Mehrere Kommentatoren debattieren, ob die Programmiersprache Zig als "besseres C" eine passendere Wahl gewesen wäre, während andere die Vorteile von Rusts striktem Borrow-Checker und der fearless concurrency für hochparalleles Linken betonen.
Glossar
Linker: Ein Software-Werkzeug, das kompilierte Objektdateien zu einer einzigen ausführbaren Datei oder Bibliothek zusammenfügt.
Drop-in-Ersatz: Ein Programm, das ein bestehendes Werkzeug nahtlos ohne Konfigurations- oder Codeänderungen ersetzen kann, da es exakt dieselbe Befehlsschnittstelle bedient.
Cargo: Das offizielle Paketmanagement- und Build-System der Programmiersprache Rust.
CMake: Ein weit verbreitetes, sprachunabhängiges Build-System zur plattformübergreifenden Steuerung von Software-Kompilierungen.
mimalloc: Ein kompakter, hochleistungsfähiger Speicher-Allocator (Memory Allocator) von Microsoft, optimiert für geringen Overhead und Multithreading.
BLAKE3: Eine kryptografische Hash-Funktion, die auf extreme Verarbeitungsgeschwindigkeit und Parallelisierbarkeit ausgelegt ist.
Relokation: Der Prozess, bei dem Platzhalter-Speicheradressen in kompiliertem Code durch die finalen physischen oder virtuellen Speicheradressen ersetzt werden.
Thunks: Kleine, vom Linker automatisch generierte Code-Schnipsel, die Sprünge über weite Distanzen im Speicher ermöglichen, wenn das direkte Sprungziel außerhalb der Prozessor-Reichweite liegt.
Bootstrapping: Ein rekursiver Prozess, bei dem einfache oder ältere Werkzeuge genutzt werden, um modernere Versionen desselben Werkzeugs (oder Compilers) zu bauen, bis hin zum Ursprungscode.
COMDAT: Ein Mechanismus in Objektdateien, der identischen, duplizierten Code (z. B. aus C++-Templates) beim Verknüpfen automatisch dedupliziert und zusammenführt.