web-dev-qa-db-ja.com

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"

一部のブログでは、作成者がmake.confファイルにも[〜#〜] ldflags [〜#〜]を設定していることに気付きましたが、それはしませんでした。 。

オペレーティングシステムは、選択したプロファイルに従ってこれらのLDFLAGSを設定します。

$ emerge --info | grep LDFLAGS

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

Gentoo開発者とメンテナ 変更することはお勧めしません

これらの行をmake.confファイルに設定してから、ツールチェーンとワールドを再構築したいと思います。

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

パフォーマンス/安定性に違いはありますか?

これらの違いは、全世界を再コンパイルするのに必要な時間の価値がありますか?

経験豊富なGentooユーザー/メンテナー/プログラマー/管理者からの提案、説明、より良い実践を聞きたいです...

事前にどうもありがとうございました!

3
user2868193

追加するためにCFLAGSを変更する必要はありません-Wl、-lfto;リンクにCFLAGSを誤って使用しているパッケージがない限り、役に立ちません(そして、それらのパッケージはbugzillaに報告する必要があります)。

ただし、LTOを最大限に活用するには、LDFLAGSに-fltoを追加する必要があります。 LDFLAGS = "-Wl、-O1 -Wl、-必要に応じて-Wl、-flto"

LDFLAGSに追加するまで、実際にはLTOのパフォーマンスは得られないため、LTO自体を明示的に有効/無効にしなかったものはすべて再コンパイルする必要があります。

3
robbat2

LTOビルドを実行するときは、コンパイラとLTOリンカの両方に同じ最適化フラグを渡すことが重要です。これは、-Onだけではなく、実際には他のすべての最適化フラグを意味します。

コンパイラ自体を使用して最終的なバイナリとリンクをシングルパスでビルドすると、すべて機能します。 2つのパス(libtool、私はあなたを見ています!)でそれを行うと、すべての地獄が解き放たれます。

したがって、はい、そうです正確に正しい CFLAGSとCXXFLAGSの最適化関連のすべてがLDFLAGSにも存在することを強制します。そして、それらは必須一致結果が正しいためには、gccのドキュメントがそうでないことを示唆しているように見えるという事実は、gccに対して報告されたバグです。

LDFLAGSに特別なことを何もせずに強制する必要があるか、LDFLAGSでそれらを複製する必要があるかは、パッケージで使用されるビルドシステム、およびlibtoolとその同類によるレイトリンクが発生するかどうかによって異なります。

1
anonymous

This および this 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フォーラムへの別の投稿 ここ。

0
Petross404