我在用着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...
整个世界都是由低温多晶硅,除了几个包:
$ 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
文件中设置这些行,然后重建工具链和世界:
CFLAGS="-march=core-avx-i -mtune=core-avx-i -O2 -pipe -flto -Wl,-flto"
LDFLAGS="-Wl,-flto -Wl,-O2"
性能/稳定性会有什么不同吗?
这些差异是否值得花费时间重新编译整个世界?
我希望听取经验丰富的 Gentoo 用户/维护人员/程序员/管理员的建议、解释和更好的实践……
提前非常感谢您!
答案1
你不需要改变你的 CFLAGS 来添加-Wl,-lfto;除非有些包错误地使用 CFLAGS 进行链接,否则它不会有帮助(并且这些包应该报告给 bugzilla)。
但是您确实需要将 -flto 添加到 LDFLAGS 才能充分利用 LTO。 LDFLAGS="-Wl,-O1-Wl,--按需-Wl,-flto"
在您的 LDFLAGS 中添加此功能之前,您实际上不会获得 LTO 性能,因此,是的,您需要重新编译任何未明确启用/禁用 LTO 本身的内容。
答案2
在进行 LTO 构建时,向编译器和 LTO 链接器传递相同的优化标志非常重要。这不仅仅意味着 -On,实际上还包括所有其他优化标志。
当您在一次传递中构建最终二进制文件并使用编译器本身进行链接时,一切都会正常。如果您在两次传递中完成此操作(libtool,我正在看着你!),那么一切都会变得一团糟。
是的,确实如此非常正确强制要求 CFLAGS 和 CXXFLAGS 中与优化相关的所有内容也出现在 LDFLAGS 中。并且它们必须 匹配为了确保结果正确,gcc 文档似乎暗示了其他情况,这是针对 gcc 报告的一个错误。
是否需要通过对 LDFLAGS 不执行任何特殊操作来强制执行它,或者在 LDFLAGS 中复制它们取决于包使用的构建系统,以及是否会发生 libtool 及其同类的后期链接。
答案3
这和这GentooLTO 覆盖的帖子明确指出,添加 LTOLDFLAGS
不是通过-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 论坛上的另一篇帖子这里。