Gentoo LDFLAGS-Optimierungen wirklich nötig?

3974
user2868193

Ich benutze Gentoo Linux .

Hier ist meine Toolchain:

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" 

Hier sind meine CFLAGS:

$ cat /etc/portage/make.conf

CFLAGS="-march=core-avx-i -mtune=core-avx-i -O2 -pipe -flto" CXXFLAGS="$"  CHOST="x86_64-pc-linux-gnu" # etc... 

Die ganze Welt wird mit LTO erstellt, mit Ausnahme einiger Pakete:

$ 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="$ -fno-lto" CXXFLAGS="$ -fno-lto" LDFLAGS="$ -fno-lto" 

In einigen Blogs bemerkte ich, dass Autoren LDFLAGS auch in ihrer make.conf-Datei festlegen. Ich habe das nicht getan.

Das Betriebssystem stellt diese LDFLAGS entsprechend dem ausgewählten Profil ein:

$ emerge --info | grep LDFLAGS

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

Gentoo Entwickler und Betreuer empfehlen keinen Austausch

Ich möchte diese Zeilen in meine make.confDatei setzen und dann Toolchain und World neu erstellen:

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

Gibt es Unterschiede in der Leistung / Stabilität?

Sind diese Unterschiede die Zeit wert, um die gesamte Welt neu zu kompilieren?

Ich würde gerne Vorschläge, Erklärungen und bessere Praktiken von erfahrenen Gentoo-Benutzern / Programmierern / Programmierern / Administratoren hören ...

Vielen Dank im Voraus!

3
Von Ihrem Link aus empfinden Sie es nicht wirklich, sie zu ändern. Sie sagen nur, es sei nicht notwendig. Sie haben sie auch nicht geändert. Die Ausgabe von `emerge --info` ist das, was bereits eingestellt ist. Wenn Sie also den gleichen Wert explizit setzen, ändert sich dadurch nichts. Diese Frage könnte mehr zum Thema auf unix.stackexchange.com sein. Seien Sie also nicht verwirrt, wenn sie dorthin verschoben wird (die Konten beider Sites werden zusammengeführt, wenn Sie sich mit derselben Authentifizierung registrieren). Tim vor 11 Jahren 0
@Tim Werden Sie "--as-needed" automatisch durch "-Wl, -flto -Wl, -O2" ersetzt? user2868193 vor 11 Jahren 0
Entschuldigung, ich habe diesen Unterschied übersehen. Du veränderst sie etwas. Übrigens: Sollten Sie LTO nicht auch in den LDFLAGS aktivieren? Tim vor 11 Jahren 0
Übrigens ist "-march" eine Obermenge von "-mtune". Beides zu haben ist sinnlos. Daniel B vor 9 Jahren 0

2 Antworten auf die Frage

1
robbat2

Sie müssen Ihre CFLAGS dort nicht ändern, um -Wl, -lfto hinzuzufügen . Wenn es nicht einige Pakete gibt, die CFLAGS fälschlicherweise zum Verknüpfen verwenden, ist dies nicht hilfreich (und diese Pakete sollten bugzilla gemeldet werden).

Sie müssen jedoch LDFLAGS -flto hinzufügen, um den vollen Nutzen von LTO zu erhalten. LDFLAGS = "- Wl, -O1-Wl, - bei Bedarf - Wl, -flto"

Sie erhalten keine LTO-Leistung, bis Sie den Zusatz in Ihrem LDFLAGS haben. Daher müssen Sie alles neu kompilieren, das LTO nicht explizit aktiviert / deaktiviert hat.

1
anonymous

Bei LTO-Builds müssen die gleichen Optimierungsflags sowohl an den Compiler als auch an den LTO-Linker übergeben werden. Dies bedeutet nicht nur -On, sondern eigentlich alle anderen Optimierungsflags.

Wenn Sie die endgültige Binärdatei erstellen und die Verknüpfung mit dem Compiler selbst in einem einzigen Durchgang erstellen, funktioniert alles. Wenn Sie es in zwei Durchgängen machen (libtool, ich schaue Sie an!), Bricht die Hölle los.

Ja, es ist genau richtig zu erzwingen, dass alles, was mit CFLAGS und CXXFLAGS in Bezug auf die Optimierung zu tun hat, auch in LDFLAGS vorhanden ist. Sie müssen übereinstimmen, damit die Ergebnisse korrekt sind. Die Tatsache, dass die gcc-Dokumentation etwas Anderes impliziert, ist ein gemeldeter Fehler gegen gcc.

Ob Sie dies erzwingen müssen, indem Sie nichts Besonderes für LDFLAGS tun oder es in LDFLAGS duplizieren, hängt vom Build-System des Pakets ab und davon, ob eine spätere Verlinkung durch libtool und dessen Eigenschaften auftritt.