LTO: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
м (defile -> define, grammar)
Строка 1: Строка 1:
C 24 августа 2021 года в Сизифе включена<ref>[https://lists.altlinux.org/pipermail/devel/2021-August/215165.html I: LTO in %optflags by default]</ref> LTO (''link-time optimization'')<ref>[https://gcc.gnu.org/onlinedocs/gccint/LTO.html https://gcc.gnu.org/onlinedocs/gccint/LTO.html]</ref>.
C 24 августа 2021 года в Сизифе включена<ref>[https://lists.altlinux.org/pipermail/devel/2021-August/215165.html I: LTO in %optflags by default]</ref> LTO (''link-time optimization'')<ref>[https://gcc.gnu.org/onlinedocs/gccint/LTO.html https://gcc.gnu.org/onlinedocs/gccint/LTO.html]</ref>.


* LTO - это безусловно полезная оптимизация, об этом много написано, см. напр. <ref>[https://documentation.suse.com/sbp/all/html/SBP-GCC-10/index.html Advanced Optimization and New Capabilities of GCC 10]</ref>, поэтому ею хорошо было бы воспользоваться
* LTO - это безусловно полезная оптимизация, об этом много написано, см. напр. <ref>[https://documentation.suse.com/sbp/all/html/SBP-GCC-10/index.html Advanced Optimization and New Capabilities of GCC 10]</ref>, поэтому ею хорошо было бы воспользоваться;


* LTO — это уже широко распространённая оптимизация, её уже включили в openSUSE<ref>[https://en.opensuse.org/openSUSE:LTO openSUSE:LTO]</ref>, Fedora<ref>[https://fedoraproject.org/wiki/LTOByDefault LTOByDefault in Fedora Project]</ref>, Ubuntu<ref>[https://wiki.ubuntu.com/ToolChain/LTO https://wiki.ubuntu.com/ToolChain/LTO]</ref>, ClearLinux, скоро Debian, там уже вытоптали основные грабли, большинство фиксов пакетов заапстримлено, поэтому ею уже можно пользоваться;
* LTO — это уже широко распространённая оптимизация, её уже включили в openSUSE<ref>[https://en.opensuse.org/openSUSE:LTO openSUSE:LTO]</ref>, Fedora<ref>[https://fedoraproject.org/wiki/LTOByDefault LTOByDefault in Fedora Project]</ref>, Ubuntu<ref>[https://wiki.ubuntu.com/ToolChain/LTO https://wiki.ubuntu.com/ToolChain/LTO]</ref>, ClearLinux, скоро Debian, там уже вытоптали основные грабли, большинство фиксов пакетов заапстримлено, поэтому ею уже можно пользоваться;
Строка 17: Строка 17:
С такими пакетами можно поступить одним из двух способов:
С такими пакетами можно поступить одним из двух способов:
* перестать паковать статические библиотеки;
* перестать паковать статические библиотеки;
* включить <tt>-ffat-lto-objects</tt> добавив в спек-файл
* включить <tt>-ffat-lto-objects</tt>, добавив в спек-файл
  %{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects}
  %{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects}


Строка 28: Строка 28:
Clang поддерживает LTO, но не поддерживает ''auto'' в <tt>-flto=auto</tt> и опцию <tt>-ffat-lto-objects</tt>,
Clang поддерживает LTO, но не поддерживает ''auto'' в <tt>-flto=auto</tt> и опцию <tt>-ffat-lto-objects</tt>,
поэтому для пакетов собираемых Clang нужно переопределить <tt>optflags_lto</tt> или отключить LTO, например:
поэтому для пакетов собираемых Clang нужно переопределить <tt>optflags_lto</tt> или отключить LTO, например:
  %defile optflags_lto -flto=thin
  %define optflags_lto -flto=thin


== Top-level asm ==
== Top-level asm ==
Наиболее актуально для крипто и математических библиотек.
Наиболее актуально для криптографических и математических библиотек.
Из-за бага в GCC ([https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57703 PR57703]) <tt>configure</tt>
Из-за бага в GCC ([https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57703 PR57703]) <tt>configure</tt>
скрипты содержащие тесты с <tt>asm()</tt> дадут не правильный результат, что может сломать
скрипты содержащие тесты с <tt>asm()</tt> дадут не правильный результат, что может сломать
Строка 38: Строка 38:


== Прочие проблемы ==
== Прочие проблемы ==
Другие проблемы, связанные с включением LTO. С такими пакетами можно поступить одним из
При сборке некоторых пакетов могут встречаться и другие проблемы, связанные с включением LTO. С такими пакетами можно поступить одним из
нескольких способов:
нескольких способов:
* обновить пакеты, весьма вероятно, что они уже исправлены в новых версиях;
* обновить пакеты, весьма вероятно, что они уже исправлены в новых версиях;

Версия от 14:52, 27 августа 2021

C 24 августа 2021 года в Сизифе включена[1] LTO (link-time optimization)[2].

  • LTO - это безусловно полезная оптимизация, об этом много написано, см. напр. [3], поэтому ею хорошо было бы воспользоваться;
  • LTO — это уже широко распространённая оптимизация, её уже включили в openSUSE[4], Fedora[5], Ubuntu[6], ClearLinux, скоро Debian, там уже вытоптали основные грабли, большинство фиксов пакетов заапстримлено, поэтому ею уже можно пользоваться;
  • LTO — это уже настолько распространённая оптимизация, что скоро без LTO уже мало кто будет собирать, поэтому не пользоваться ею скоро будет себе дороже;

LTO поддерживается на всех архитектурах, кроме некоторых вторичных, где не GCC тулчейн.

Возникающие ошибки и их исправление

Упаковка статических библиотек (.a)

Пакеты, собирающие статические библиотеки, могут получить ошибку вида

process-lto: ERROR: ./usr/lib64/libtcb.a: contains __gnu_lto_slim

С такими пакетами можно поступить одним из двух способов:

  • перестать паковать статические библиотеки;
  • включить -ffat-lto-objects, добавив в спек-файл
%{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects}

Статические библиотеки и объекты (.o) от других архитектур

Для ошибок вида

/usr/bin/strip: Unable to recognise the format of the input file `./usr/libexec/arm-none-eabi/lib/libm.a(lib_a-wrf_lgamma.o)'

сборку можно исправить, добавив такие библиотеки в %brp_strip_none.

Сборка с использованием Clang

Clang поддерживает LTO, но не поддерживает auto в -flto=auto и опцию -ffat-lto-objects, поэтому для пакетов собираемых Clang нужно переопределить optflags_lto или отключить LTO, например:

%define optflags_lto -flto=thin

Top-level asm

Наиболее актуально для криптографических и математических библиотек. Из-за бага в GCC (PR57703) configure скрипты содержащие тесты с asm() дадут не правильный результат, что может сломать сборку. Для обхода можно включить -ffat-lto-objects. То же самое происходит у Clang, но там обход применить нельзя и придется LTO отключить.

Прочие проблемы

При сборке некоторых пакетов могут встречаться и другие проблемы, связанные с включением LTO. С такими пакетами можно поступить одним из нескольких способов:

  • обновить пакеты, весьма вероятно, что они уже исправлены в новых версиях;
  • исправить LTO самостоятельно;
  • в крайнем случае, выключить LTO, переопределив макрос optflags_lto:
%define optflags_lto %nil

Ссылки