Разработчики высокоскоростного линковщика mold, предназначенного для ускорения процесса сборки программ в Unix-системах, представили значимое обновление до версии 3.0. Ключевым изменением в этом релизе стал полный переход проекта с языка C++ на Rust. Версия 3.0 является первой итерацией, полностью базирующейся на новой реализации, в то время как ветка 2.42.1 остается последним выпуском, созданным на исходной кодовой базе C++.

Особенности перехода на Rust и производительность
По заявлениям создателей, новая версия mold 3.0 сохраняет полную совместимость с предыдущими вариантами: линковщик поддерживает те же целевые архитектуры, принимает идентичные параметры командной строки и создает аналогичный выходной результат, исключая исправления ошибок, включенные в релиз. Скорость линковки при этом осталась на уровне, характерном для версии на C++.
Перенос проекта на Rust существенно улучшил обработку поврежденных входных файлов. Если ранее в реализации на C++ некорректные данные могли приводить к чтению памяти за пределами выделенного диапазона и возникновению ошибок сегментации (segmentation faults), то в версии на Rust подобные обращения проходят проверку границ. В случае обнаружения проблем mold теперь корректно останавливает выполнение операции, предотвращая критические сбои.
Изменения для сборки из исходного кода
Пользователям, собирающим mold самостоятельно, следует учитывать важные изменения в процессе компиляции. Проект отказался от использования CMake в пользу системы Cargo, что требует наличия установленного Rust версии 1.95 или новее, а также C-компилятора. Прежние опции конфигурации CMake были удалены, а выбор целевых архитектур теперь осуществляется через функции Cargo. Также проект отказался от зависимости oneTBB, однако сохранил статическую линковку аллокатора mimalloc по умолчанию с возможностью переключения на системный аллокатор.
Исправления и совместимость с GNU ld
Помимо фундаментального переписывания кода, версия 3.0 содержит множество исправлений и улучшений совместимости. Устранены ошибки, вызывавшие сбои при работе со статически скомпонованными исполняемыми файлами и скриптами версий, исправлено повреждение данных при использовании одного и того же файла в качестве входного и выходного, а также решены проблемы с недетерминированным выводом и ошибки при линковке с опцией -r.
Значительно повышена совместимость с GNU ld в области обработки аргументов командной строки, работы с версиями символов и поведении при перемещении (relocation). В ряде сценариев, ранее приводивших к созданию некорректного кода или завершению работы с ошибкой, mold теперь выводит соответствующие уведомления. Специфические исправления коснулись архитектур AArch64, ARM32, i386, RISC-V, LoongArch, PPC32, PPC64, m68k, SH4 и SPARC64. Кроме того, расширена поддержка типов перемещений для AArch64 и ARM32, а также решены проблемы с TLS и перемещениями на платформах RISC-V и LoongArch.
В планах разработчиков на серию 3.x стоит задача по устранению оставшихся пробелов в совместимости с GNU ld, в частности в части работы со скриптами линковщика. Авторы проекта рассчитывают, что проделанная работа позволит сделать mold предпочтительным линковщиком по умолчанию в различных дистрибутивах Linux.






