Der gold
Linker wurde als ein ELF-spezifischer Linker entwickelt, mit der Absicht, einen besser wartbaren und schnelleren Linker als BFD ld
zu produzieren (der „traditionelle“ GNU-Binutils-Linker). Als Nebeneffekt ist es tatsächlich in der Lage, sehr große Programme zu linken, die weniger Speicher benötigen als BFD ld
, vermutlich, weil es weniger Abstraktionsebenen zu bewältigen gilt und weil die Datenstrukturen des Linkers direkter auf das ELF-Format abgebildet werden.
Ich bin mir nicht sicher, ob es viele Dokumentationen gibt, die sich speziell mit den Designunterschieden zwischen den beiden Linkern und ihren Auswirkungen auf die Speichernutzung befassen. Es gibt eine sehr interessante Artikelserie über Linker von Ian Lance Taylor, dem Autor der verschiedenen GNU-Linker, die viele der Designentscheidungen erklärt, die zu gold
geführt haben . Das schreibt er
Der Linker, an dem ich jetzt arbeite, namens Gold, wird mein dritter sein. Es handelt sich ausschließlich um einen ELF-Linker. Auch hier ist das Ziel Geschwindigkeit, in diesem Fall schneller als mein zweiter Linker. Dieser Linker wurde im Laufe der Jahre erheblich verlangsamt, indem Unterstützung für ELF und gemeinsam genutzte Bibliotheken hinzugefügt wurde. Diese Unterstützung wurde nicht eingebaut, sondern gepatcht.
(Der zweite Linker ist BFD ld
.)
Der Gold-Linker wurde geschrieben, um den Verknüpfungsprozess erheblich zu beschleunigen. Laut dem Goldautor Ian Lance Taylor
Im Moment hat Gold nur einen entscheidenden Vorteil gegenüber den bestehenden Linkern:Es ist schneller. Bei großen C++-Programmen habe ich gemessen, dass es fünfmal schneller läuft.
Er vergleicht die Leistung des Gold-Linkers mit dem traditionellen GNU-Linker. Gold verwendet (anders als der GNU-Linker) nicht die BFD-Bibliothek, um Objektdateien zu verarbeiten.
Die Einschränkung von Gold besteht darin, dass es (im Gegensatz zum GNU-Linker, der viele Objektdateitypen verarbeiten kann) nur Objektdateien im ELF-Format verknüpfen kann.
In Bezug auf die Probleme, mit denen Sie bei der Verwendung von GNU-Linkern konfrontiert waren, finden Sie hier eine interessante Antwort auf eine ähnliche Frage zu SO von Michael Adam:
Der Gold-Linker hat sogar einige Abhängigkeitsprobleme in unserem Code gefunden, da er in einigen Details korrekter zu sein scheint als der klassische. Siehe z.B. dieses Samba-Commit.
gold
vs. ld
Benchmark
Ich habe einen konkreten synthetischen Benchmark von ld vs. Gold veröffentlicht unter:https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#53921263
Zusammenfassung der Ergebnisse:Gold war 2- bis 3-mal schneller als ld.
Dieser Zeitgewinn kann bei komplexen C++-Projekten mit außer Kontrolle geratenen Vorlagen und Codegenerierung ein großer Spielveränderer sein, da der Verknüpfungsschritt alle Dateien aus dem Projekt umfasst und im Gegensatz zur Kompilierung immer durchgeführt werden muss, auch wenn Sie sich ändern nur eine einzelne .cpp-Datei.
Eine langsame Verbindungszeit macht den Entwicklungszyklus also unerträglich und ist wahrscheinlich der Hauptgrund dafür, dass Google Ressourcen darin investiert hat. Stellen Sie sich nur vor, wie vorteilhaft es wäre, bei jeder trivialen Dateiänderung 10 statt 30 Sekunden zu warten.
Die Zeitgewinne des synthetischen Benchmarks stimmten auch mit den tatsächlichen Gewinnen überein, die ich bei einem komplexen realen Projekt (gem5) hatte, wie auch in dieser Antwort erwähnt.