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

Материал из ALT Linux Wiki
(Новая страница: «В Сизифе включена LTO (link-time optimization). LTO — это уже широко распространённая оптимизация, её…»)
 
Нет описания правки
Строка 1: Строка 1:
В Сизифе включена LTO (link-time optimization).
C 24 августа 2021 года в Сизифе включена LTO (link-time optimization)<ref>[https://lists.altlinux.org/pipermail/devel/2021-August/215165.html I: LTO in %optflags by default]</ref>.


LTO — это уже широко распространённая оптимизация, её уже включили в
LTO — это уже широко распространённая оптимизация, её уже включили в
openSUSE, Fedora, Ubuntu, Clearlinux, скоро Debian, там уже вытоптали
openSUSE<ref>[https://documentation.suse.com/sbp/all/html/SBP-GCC-10/index.html Advanced Optimization and New Capabilities of GCC 10]</ref>,
Fedora, Ubuntu<ref>[https://wiki.ubuntu.com/ToolChain/LTO https://wiki.ubuntu.com/ToolChain/LTO]</ref>,
ClearLinux, скоро Debian, там уже вытоптали
основные грабли, большинство фиксов пакетов заапстримлено, поэтому ею
основные грабли, большинство фиксов пакетов заапстримлено, поэтому ею
уже можно пользоваться;
уже можно пользоваться;
Строка 10: Строка 12:
дороже;
дороже;


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


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


=== process-lto: ERROR ===
== Упаковка статических библиотек (.a) ==
Исправление самой массовой сборочной ошибки "process-lto: ERROR:", вызванной включением LTO, тривиально.
Пакеты, собирающие статические библиотеки, могут получить ошибку вида
process-lto: ERROR: ./usr/lib64/libtcb.a: contains __gnu_lto_slim
 
С такими пакетами можно поступить одним из двух способов:
* перестать паковать статические библиотеки;
* включить <tt>-ffat-lto-objects</tt> добавив в спек-файл
%{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects}


=== /usr/bin/strip: Unable to recognise the format ===
=== Статические библиотеки и объекты (.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)'
  /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.
сборку можно исправить, добавив такие библиотеки в <tt>%brp_strip_none</tt>.


=== Упаковка статических библиотек ===
== Сборка Clang ==
Пакеты, собирающие статические библиотеки, могут получить ошибку вида
Clang не поддерживает <tt>-flto=auto</tt> и <tt>-ffat-lto-objects</tt>, поэтому для пакетов собираемых
  process-lto: ERROR: ./usr/lib64/libtcb.a: contains __gnu_lto_slim only.
Clang надо переопределить <tt>optflags_lto</tt>, например:
  %defile optflags_lto -flto=thin
или отключить LTO.


С такими пакетами можно поступить одним из двух способов:
== Top-level asm ==
* перестать паковать статические библиотеки;
Из-за бага в GCC ([https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57703 PR57703]) configure
* добавить в спек-файл
скрипты содержащие тесты с <tt>asm()</tt> дадут не правильный результат, что может сломать
%{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects}
сборку. Для обхода можно включить <tt>-ffat-lto-objects</tt>. То же самое происходит у
Clang, но там обход применить нельзя и придется LTO отключить.


=== Прочие проблемы ===
== Прочие проблемы ==
Другие проблемы, связанные с включением LTO. С такими пакетами можно поступить одним из
Другие проблемы, связанные с включением LTO. С такими пакетами можно поступить одним из
нескольких способов:
нескольких способов:
* обновить пакеты, весьма вероятно, что они уже исправлены в новых версиях;
* обновить пакеты, весьма вероятно, что они уже исправлены в новых версиях;
* исправить LTO самостоятельно;
* исправить LTO самостоятельно;
* выключить LTO, переопределив макрос optflags_lto:
* в крайнем случае, выключить LTO, переопределив макрос <tt>optflags_lto</tt>:
  %define optflags_lto %nil
  %define optflags_lto %nil


 
= Ссылки =
== Ссылки ==
<references />
* https://lists.altlinux.org/pipermail/devel/2021-August/215165.html
* https://documentation.suse.com/sbp/all/html/SBP-GCC-10/index.html
* https://wiki.ubuntu.com/ToolChain/LTO


[[Категория:Packaging]]
[[Категория:Packaging]]

Версия от 22:36, 26 августа 2021

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

LTO — это уже широко распространённая оптимизация, её уже включили в openSUSE[2], Fedora, Ubuntu[3], 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 не поддерживает -flto=auto и -ffat-lto-objects, поэтому для пакетов собираемых Clang надо переопределить optflags_lto, например:

%defile optflags_lto -flto=thin

или отключить LTO.

Top-level asm

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

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

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

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

Ссылки