mold 2.42.0

После четырёх месяцев разработки состоялся выпуск 2.42.0 высокопроизводительного кроссплатформенного линкера mold.
Проект написан на языке C++ (стандарт C++20) и распространяется по лицензии MIT.
Основные изменения:
- произведено множество оптимизаций всего линкера — эта версия должна работать заметно быстрее, чем предыдущие версии, особенно при компоновке крупных программ на машинах с большим количеством ядер;
- добавлена поддержка параметров
--pack-dyn-relocs=androidи--pack-dyn-relocs=android+relr. Эти параметры кодируют динамические релокации в формате упакованных релокаций Android (APS2), что значительно уменьшает размер таблицы динамических релокаций бинарных файлов Android; --compress-debug-sectionsтеперь принимает параметр уровня сжатия, напримерzstd:9илиzlib:6. Простые значения zstd и zlib по-прежнему соответствуютzstd:3иzlib:1соответственно — это были прежние, жёстко заданные значения по умолчанию;- добавлена поддержка параметров
-wи--no-warnings. Они подавляют вывод предупреждений и отменяют действие опции--fatal-warnings, при этом о реальных ошибках по-прежнему выдаются сообщения. Это соответствует поведениюlld; - добавлена поддержка опции
-Ttext-segment, которая задаёт адрес первого байта текстового сегмента, для обеспечения совместимости с GNUld; - добавлена поддержка формата развёртки стека SFrame версии 3 — компактной альтернативы формату
.eh_frame, используемого профилировщиками и отладчиками для асинхронной развёртки стека. Начиная с версииbinutils 2.46, ассемблер GNU генерирует SFrame версии 3 при указании флага--gsframe, поэтому объектные файлы, содержащие секции.sframe, становятся всё более распространёнными. Секции.sframeнельзя рассматривать как непрозрачные байты;moldанализирует входные секции.sframe, отбрасывает записи для функций, удалённых с помощью флагов--gc-sectionsили--icf, и воссоздаёт единую объединённую секцию, отсортированную по адресам функций, вместе с сегментомPT_GNU_SFRAME, чтобы среда выполнения могла её найти. Также поддерживается переразмещаемый вывод (-r); - теперь
moldпо умолчанию удаляет временные локальные символы, такие как.L.str.42, так же, как это делаетlld. Компиляторы генерируют большое количество таких символов для безымянных элементов программы, но они являются внутренними для компилятора; ничто не ссылается на них через таблицу символов, а отладочная информация обращается к их данным по смещению в секции. Их удаление позволяет уменьшить размер больших отладочных сборок на несколько процентов и исключить внутренние метки компилятора из символизированных адресов. Новый параметр--discard-noneвосстанавливает прежнее поведение. Параметры-rи--emit-relocsпо-прежнему сохраняют все локальные символы; - для сборки
moldтеперь требуется библиотека mimalloc версии 3. По умолчаниюmoldкомпилируется и статически линкуется со входящей в исходные текстыmimallocверсии 3.4.5. Для использования системной библиотекиmimallocможно использовать параметр CMake-DMOLD_USE_SYSTEM_MIMALLOC=ON; - исправлено большое количество обнаруженных ошибок и улучшена совместимость.
>>> Подробности на GitHub
