openSUSE:LTO
Содержание
Вступление
Межпроцедурная оптимизация (LTO) дает GCC возможность выгрузки своего внутреннего представления (GIMPLE) на диск, что позволяет проанализировать все модули компиляции, составляющие один исполняемый файл, и выполнить различные оптимизации. Их применение, как правило, повышает скорость исполнения и приводит к удалению неиспользуемого кода, а также позволяет уменьшить двоичные файлы и отладочную информацию.
Активация LTO в openSUSE:Factory
Мы хотели бы включить LTO в настройках проекта, в частности, в $optflags
будет добавлен новый макрос RPM %{_lto_cflags}
. Этот макрос развёртывается в -flto=N
, где N — количество потоков (используется для параллельного LTO-связывания). $optflags
автоматически расширяются до CFLAGS и CXXFLAGS или применяются в cmake и подобных системах сборки. LTO будет автоматически включена в большинстве пакетов, которые используют компилятор GCC.
Основываясь на наших экспериментах, существуют пакеты, которые в настоящее время не могут быть собраны с включенной LTO. Мы ожидаем, что количество таких пакетов будет превышать 5%. В bugzilla будут созданы записи для таких пакетов и предоставлен краткий анализ. Наиболее распространенные проблемы будут собраны на этой странице WIKI.
Отключение LTO в SPEC-файле
Для отключения LTO достаточно добавить строку %define _lto_cflags %{nil}
в SPEC-файл.
Воспроизведение ошибок сборки с LTO
Прямо сейчас нет промежуточных проектов в которых можно было бы увидеть ошибку сборки. Однако можно легко включить LTO добавив следующую строку в SPEC-файл:
%global optflags %optflags %{_lto_cflags}
FAQ по ошибкам сборки пакетов
Версионирование библиотек (symbol versioning)
Symbol versioning на данный момент не поддерживается. Перейдите по ссылке issue для получения дополнительной информации. Добавление поддержки данной возможности запланировано в версии GCC 10.1. Возможный обходной путь описан на Stack Overflow.
Интроспекция GObject
Сборка пакетов GNOME может потерпеть неудачу из-за следующей проблемы. Проблема все еще расследуется. Пример сообщения об ошибке:
Invalid GType function: 'ostree_async_progress_get_type' Failed to find symbol 'ostree_async_progress_get_type'
Статические библиотеки
Некоторые пакеты поставляют статические библиотеки, которые были скопированы из архива. Такие библиотеки содержат только байт-код LTO и должны быть специальным образом обработаны. Для этого следует использовать -ffat-lto-objects
и brp-check-suse
для удаления байт-кода.
В большинстве случаев самым простым способом является добавление в верхней части spec-файла следующей строки:
%global _lto_cflags %{_lto_cflags} -ffat-lto-objects