04.07.2022

Первый стабильный релиз компоновщика Mold, развиваемого разработчиком LLVM lld

Rui Ueyama, автор компоновщика LLVM lld и компилятора chibicc, представил первый стабильный релиз нового высокопроизводительного компоновщика Mold, заметно опережающего по скорости связывания объектных файлов компоновщики GNU gold и LLVM lld. Проект признан готовым для рабочих внедрений и может применяться в качестве более быстрой прозрачной замены GNU linker на Linux-системах. Из планов на следующий значительный выпуск отмечается доведение до готовности поддержки платформы macOS, после чего начнётся работа по адаптации Mold для Windows.

Mold написан на языке С++ (C++20) и распространяется под лицензией AGPLv3, которая совместима с GPLv3, но не совместима с GPLv2, так как требует открытия изменений при разработке сетевых сервисов. Подобный выбор объясняется желанием получить финансирование разработки — автор готов продать права на код для перелицензирования под разрешительной лицензией, такой как MIT, или предоставить отдельную коммерческую лицензию для тех, кого не устраивает AGPL.

Mold поддерживает все возможности GNU linker и отличается очень высокой производительностью — компоновка выполняется со скоростью, всего в два раза медленнее простого копирования файлов утилитой cp. Например, при сборке Chrome 96 (размером кода 1.89 ГБ) на компоновку исполняемых файлов c debuginfo на 8-ядерном компьютере при использовании GNU gold тратится 53 секунды, LLVM lld — 11.7 секунд, а Mold всего 2.2 секунды (в 26 раз быстрее GNU gold). При компоновке Clang 13 (3.18 ГБ) в GNU gold требуется 64 секунды, в LLVM lld — 5.8 секунд, а в Mold — 2.9 секунды. При компоновке Firefox 89 (1.64 ГБ) в GNU gold необходимо 32.9 секунд, в LLVM lld — 6.8 секунд, а в Mold — 1.4 секунды.

Сокращение времени на компоновку позволяет значительно повысить удобство разработки больших проектов за счёт сокращение ожидания в процессе формирования исполняемых файлов при отладке и тестирования изменений. Мотивом к созданию Mold стало раздражение от необходимости ждать завершения компоновки после каждого внесения изменения в код, а также низкая эффективность работы существующих компоновщиков на многоядерных системах и желание опробовать принципиально иную архитектуру компоновки, не прибегая при этом к излишне усложнённым моделям, таким как инкрементальная компоновка.

Высокая производительность компоновки исполняемого файла из большого числа подготовленных компилятором объектных файлов в Mold достигается использованием более быстрых алгоритмов, активным распараллеливанием операций между доступными ядрам CPU и применением более эффективных структур данных. Например, в Mold реализована техника выполнения интенсивных вычислений одновременно с копированием файлов, упреждающая загрузка объектных файлов в память, использование быстрых хэш-таблиц при разрешении символов, сканирование таблиц перемещений в отдельном потоке и дедупликация повторяющихся в разных файлах объединяемых секций.

Источник.