Домой Софт и приложения Linux Вышел высокоскоростной линковщик mold 3.0, переписанный на Rust

Вышел высокоскоростной линковщик mold 3.0, переписанный на Rust

Проект высокопроизводительного линковщика mold перешел на язык Rust. Версия 3.0 стала первым релизом, полностью написанным на этом языке, сохранив при этом прежнюю скорость работы.

1
0

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

Логотип проекта mold

Особенности перехода на 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.

Источник: https://linuxiac.com