LTO: различия между версиями
Vt (обсуждение | вклад) Нет описания правки |
Vt (обсуждение | вклад) Нет описания правки |
||
Строка 27: | Строка 27: | ||
== Сборка Clang == | == Сборка Clang == | ||
Clang не поддерживает <tt>-flto=auto</tt> и <tt>-ffat-lto-objects</tt>, поэтому для пакетов собираемых | Clang не поддерживает <tt>-flto=auto</tt> и <tt>-ffat-lto-objects</tt>, поэтому для пакетов собираемых | ||
Clang | Clang нужно переопределить <tt>optflags_lto</tt> или отключить LTO, например: | ||
%defile optflags_lto -flto=thin | %defile optflags_lto -flto=thin | ||
== Top-level asm == | == Top-level asm == | ||
Из-за бага в GCC ([https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57703 PR57703]) configure | Из-за бага в GCC ([https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57703 PR57703]) <tt>configure</tt> | ||
скрипты содержащие тесты с <tt>asm()</tt> дадут не правильный результат, что может сломать | скрипты содержащие тесты с <tt>asm()</tt> дадут не правильный результат, что может сломать | ||
сборку. Для обхода можно включить <tt>-ffat-lto-objects</tt>. То же самое происходит у | сборку. Для обхода можно включить <tt>-ffat-lto-objects</tt>. То же самое происходит у |
Версия от 01:54, 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 не поддерживает -flto=auto и -ffat-lto-objects, поэтому для пакетов собираемых Clang нужно переопределить optflags_lto или отключить LTO, например:
%defile 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