Gentoo LDFLAGS действительно нужны оптимизации?

Я использую Gentoo Linux.

Вот мой набор инструментов:

sys-kernel/linux-headers-3.9
sys-devel/binutils-2.23.1  USE="cxx nls zlib -multislot -multitarget -static-libs {-test} -vanilla"
sys-devel/gcc-4.7.3-r1:4.7  USE="cxx fortran gtk lto mudflap (multilib) nls nptl openmp (-altivec) -doc (-fixed-point) -gcj -go -graphite (-hardened) (-libssp) -multislot -nopie -nossp -objc -objc++ -objc-gc -regression-test -vanilla"
sys-libs/glibc-2.17:2.2  USE="(multilib) -debug -gd (-hardened) -nscd -profile (-selinux) -suid -systemtap -vanilla"

Вот мои CFLAGS:

$ cat /etc/portage/make.conf

CFLAGS="-march=core-avx-i -mtune=core-avx-i -O2 -pipe -flto"
CXXFLAGS="${CFLAGS}"

CHOST="x86_64-pc-linux-gnu"
# etc...

Весь мир построен на LTO, за исключением нескольких пакетов:

$ cat /etc/portage/package.env

dev-lang/perl no-lto
dev-libs/elfutils no-lto
dev-lang/spidermonkey no-lto
dev-libs/glib no-lto
sys-devel/llvm no-lto
media-libs/mesa no-lto
media-libs/alsa-lib no-lto
sys-apps/preload no-lto
app-text/aspell no-lto
app-text/rarian no-lto
sys-power/upower no-lto
net-libs/farstream no-lto
dev-python/notify-python no-lto
x11-libs/wxGTK no-lto
media-video/avidemux no-lto
media-gfx/inkscape no-lto
x11-base/xorg-server no-lto
x11-drivers/xf86-video-intel no-lto
net-libs/webkit-gtk no-lto
mail-client/thunderbird no-lto

$ cat /etc/portage/env/no-lto

CFLAGS="${CFLAGS} -fno-lto"
CXXFLAGS="${CXXFLAGS} -fno-lto"
LDFLAGS="${LDFLAGS} -fno-lto"

В некоторых блогах я заметил, что авторы, устанавливающие LDFLAGS в их файле make.conf, я этого не делал.

Операционная система устанавливает эти LDFLAGS в соответствии с выбранным профилем:

$ emerge --info | grep LDFLAGS

LDFLAGS="-Wl,-O1 -Wl,--as-needed"

Разработчики и сопровождающие Gentoo не рекомендуют менять их

Я хотел бы установить эти строки в моем make.conf файл, затем перестройте toolchain и world:

CFLAGS="-march=core-avx-i -mtune=core-avx-i -O2 -pipe -flto -Wl,-flto"
LDFLAGS="-Wl,-flto -Wl,-O2"

Будет ли разница в производительности / стабильности?

Стоят ли эти различия времени, необходимого для перекомпиляции всего мира?

Я хотел бы услышать предложения, объяснения, лучшие практики от опытных пользователей / сопровождающих / программистов / администраторов Gentoo...

Заранее большое спасибо!

3 ответа

Вам не нужно менять свои CFLAGS там, чтобы добавить -Wl, -lfto; если нет пакетов, которые по ошибке используют CFLAGS для ссылок, это не поможет (и об этих пакетах следует сообщать в bugzilla).

Однако вам нужно добавить -flto к LDFLAGS, чтобы получить полную выгоду от LTO.LDFLAGS = "- Wl, -O1 -Wl, - по мере необходимости -Wl,-flto"

На самом деле вы не получите производительность LTO, пока не добавите в LDFLAGS дополнение, так что да, вам нужно будет перекомпилировать все, что явно не включало / не отключало само LTO.

При сборке LTO важно передавать одинаковые флаги оптимизации как компилятору, так и компоновщику LTO. Это означает не только -On, но и все остальные флаги оптимизации.

Когда вы строите финальный двоичный файл и создаете ссылку с использованием самого компилятора за один проход, все это работает. Если вы сделаете это за два прохода (libtool, я смотрю на вас!), Тогда весь ад исчезнет.

Так что, да, это правильно, что все, что связано с оптимизацией в CFLAGS и CXXFLAGS, также присутствует в LDFLAGS. И они должны совпадать, чтобы результаты были правильными, тот факт, что документация gcc, по-видимому, подразумевает иное, является сообщенной ошибкой в ​​gcc.

Нужно ли применять его, не делая ничего особенного для LDFLAGS или дублируя их в LDFLAGS, зависит от системы сборки, используемой пакетом, и от того, произойдет ли позднее связывание с помощью libtool и тому подобного.

В этом и этом посте о наложении GentooLTO четко указано, что добавление LTO вLDFLAGSне закончил с-Wl,флаг, но как-fltoили${CFLAGS}без флага компоновщика. О пакетах, которым нужен этот флаг компоновщика, следует сообщать.

Пример:

      dev-lang/python-3.8.1::pg_overlay was built with the following:
USE="gdbm ncurses readline sqlite ssl xml -bluetooth -build -examples -hardened -ipv6 -libressl -test -tk -wininst"
CFLAGS="-march=native -mtune=native -O3 -pipe -flto=7 -fuse-linker-plugin -fomit-frame-pointer -fno-plt -fno-stack-protector -s -fwrapv"
CXXFLAGS="-march=native -mtune=native -O3 -pipe -flto=7 -fuse-linker-plugin -fomit-frame-pointer -fno-plt -fno-stack-protector -s -fwrapv"
FEATURES="preserve-libs usersandbox merge-sync ipc-sandbox unmerge-logs ebuild-locks distlocks binpkg-docompress multilib-strict xattr config-protect-if-modified news parallel-fetch sandbox usersync binpkg-dostrip unknown-features-warn strict unmerge-orphans assume-digests protect-owned pid-sandbox binpkg-logs fixlafiles network-sandbox parallel-install userpriv userfetch sfperms"
LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,--sort-common -Wl,--strip-debug -flto=7 -fuse-linker-plugin -L."

Еще один пост на форумах Gentoo здесь.

Другие вопросы по тегам