Выпуск компоновщика Mold 3.0, развиваемого разработчиком LLVM lld
- Rui Ueyama выпустил Mold 3.0 — компоновщик, который можно использовать вместо GNU linker в Linux.
- Код переписан с C++20 на Rust; производительность осталась на уровне прежней версии, а повреждённые объектные файлы проходят проверку границ памяти.
- Mold 3.0 сохраняет опции и архитектуры версии 2.42.1; проект также повысил совместимость с GNU ld и заменил CMake и ctest на Cargo и cargo test.
Почему это важно: Быстрая компоновка сокращает ожидание при сборке исполняемых файлов во время отладки и тестирования изменений.
Опубликован выпуск компоновщика Mold 3.0, который может применяться в качестве более быстрой прозрачной замены GNU linker на Linux-системах. Проект развивает Rui Ueyama, автор компоновщика LLVM lld. Ключевой особенностью Mold является очень высокая скорость связывания объектных файлов, заметно опережающая компоновщики GNU gold и LLVM lld (компоновка в Mold выполняется со скоростью, всего в два раза медленнее простого копирования файлов утилитой cp). Код написан на языке Rust и распространяется под лицензией MIT.
Уменьшение времени на компоновку позволяет значительно повысить удобство разработки больших проектов за счёт сокращения ожидания в процессе формирования исполняемых файлов при отладке и тестирования изменений. Мотивом к созданию Mold стало раздражение от необходимости ждать завершения компоновки после каждого внесения изменения в код, а также низкая эффективность работы существующих компоновщиков на многоядерных системах и желание опробовать принципиально иную архитектуру компоновки, не прибегая при этом к излишне усложнённым моделям, таким как инкрементальная компоновка.
Высокая производительность компоновки исполняемого файла из большого числа подготовленных компилятором объектных файлов в Mold достигается использованием более быстрых алгоритмов, активным распараллеливанием операций между доступными ядрам CPU и применением более эффективных структур данных. Например, в Mold реализована техника выполнения интенсивных вычислений одновременно с копированием файлов, упреждающая загрузка объектных файлов в память, использование быстрых хэш-таблиц при разрешении символов, сканирование таблиц перемещений в отдельном потоке и дедупликация повторяющихся в разных файлах объединяемых секций.
Ветка Mold 3.0 примечательна переписыванием кодовой базы с C++ (C++20) на язык Rust. Mold 3.0 может использоваться в качестве прозрачной замены Mold 2.42.1, последнего выпуска на языке C++, и поддерживает все ранее доступные опции и целевые архитектуры. Переход на Rust позволил обезопасить проект от потенциальных проблем при обработке повреждённых объектных файлов — в ситуациях, когда версия на С++ аварийно завершалась из-за обращения к областям памяти за пределами буфера, вариант на Rust останавливает работу на этапе проверки границ. Производительность реализации на Rust находится на одном уровне с версией на C++.
Помимо миграции на Rust ключевой целью при разработке ветки 3.0 было повышение совместимости с GNU ld и подготовка проекта к возможности использования в качестве компоновщика по умолчанию в дистрибутивах Linux. Сборочная система заменена с CMake на Cargo, а система тестов с ctest на cargo test. Из зависимостей исключена библиотека oneTBB.
Источник: http://www.opennet.ru/opennews/art.shtml? num=66406
© OpenNet
