openSUSE:LTO

Перейти к: навигация, поиск
LTO расшифровывается как Link Time Optimization (межпроцедурная оптимизация), это метод оптимизации реализованный в GCC, который повышает скорость исполнения и уменьшает размер бинарных файлов. На этой странице собрана вся необходимая информация о включении LTO в большинстве пакетов openSUSE:Factory.

Вступление

Межпроцедурная оптимизация (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