mold 2.0.0 - schneller Linker
(github.com/rui314)- Die Lizenz wurde von AGPL auf MIT umgestellt und ist damit die wichtigste Änderung in mold 2.0.0
- Ein Bug wurde behoben, durch den bei Verwendung von
--relocatablekeine Objektdatei mit mehr als 65520 Sektionen erzeugt werden konnte -undefinedwird als Synonym für--undefinedstatt für-u ndefinedinterpretiert und entspricht damit dem Verhalten von GNU-Linkern und LLVM lld-nopiewird als Synonym für--no-piebehandelt- Unterstützung für die Relocation-Typen
R_RISCV_SET_ULEB128undR_RISCV_SUB_ULEB128auf RISC-V - Unterstützung für den Relocation-Typ
R_PPC64_REL32auf PPC64
1 Kommentare
Meinungen auf Hacker News
mold ist auf modernen Systemen wirklich eine hervorragende Arbeit.
Als ich kürzlich versucht habe, Builds in einem Projekt schneller zu machen, stellte ich fest, dass der Link-Schritt ein enormer Flaschenhals ist. Obwohl ich 24 Kerne * 2 Threads nutze, liegen wegen des Linkers etwa 30 % der Gesamtleistung brach.
Ich hatte früher schon einmal versucht, mit mold zu bauen, aber damals funktionierte es nicht richtig; ich werde es erneut ausprobieren.
An die genauen Zahlen erinnere ich mich nicht, aber es war ein ziemlich großer Unterschied: Was mit gold und lld ein paar Sekunden dauerte, fiel mit mold auf unter 1 Sekunde.
Es war komplexer C++/Qt-Code.
mold -run ninjafunktioniert in meiner Umgebung sehr gut.Die Nachricht zur Lizenzänderung freut mich sehr. Ich hoffe, dass das Projekt auch Geld verdienen kann, aber mit einer MIT-Lizenz steigt die Chance deutlich, es in Arbeitsprojekte zu integrieren.
Falls wir es tatsächlich einsetzen, werde ich versuchen, meine Firma davon zu überzeugen, das Projekt zu sponsern.
AGPL würde wohl nur dann Einschränkungen machen, wenn man einen privat modifizierten Linker als Netzwerkdienst bereitstellt; bei einem grundlegenden Entwicklungstool ist das kein realistisches Szenario.
Die Lizenzänderung macht mich neugierig. Ist das nicht eine ausführbare Datei? Software, die sie als separaten Prozess aufruft, muss dadurch nicht GPL werden; in den üblichen Fällen sollte die Umstellung auf MIT also keine Auswirkungen haben.
Wenn die Autoren wirklich eine freizügigere Lizenz wollten, hätten sie statt einer Relizenzierung von AGPL auf MIT zu AGPL mit Linking Exception wechseln sollen. Ein Beispiel für ein GPL-Projekt mit Linking Exception ist libgit2: https://github.com/libgit2/libgit2#license
Eine solche Lizenz ist freizügiger und erlaubt es trotzdem weiterhin, kommerzielle Lizenzen an diejenigen zu verkaufen, die proprietäre Änderungen vornehmen.
Die macOS-Version
soldscheint eine Ausnahme zu sein.Dieser Linker hat die Developer Experience in meinem explorativen Rust-Repository, das zu einem großen Web-Monolithen mit SeaORM und axum/tokio werden soll, spürbar verbessert.
Die Größe meines
target-Verzeichnisses wollt ihr gar nicht wissen, aber inkrementelle Builds fühlen sich deutlich flotter an.15:55 $ du -Hs --si target/11G target/Mold ist großartig, und ich habe ein paar Lieblingsanwendungen dafür.
[target.x86_64-unknown-linux-gnu]linker = "clang"rustflags = ["-C", "link-arg=-fuse-ld=mold","-C", "target-cpu=native"]makepkgschneller, wenn man"-fuse-ld=mold"zu den CFLAGS hinzufügt.Eine sehr kluge Entscheidung. Auch bei meinen Produkten oder meinem Code gibt es manchmal schwierige Momente, in denen man anerkennen muss, dass bestimmte Dinge nicht zur Monetarisierung taugen.
Der Markt sagt einem das, und so schade es ist: Statt dagegen anzukämpfen, ist es wichtig, etwas anderes zu finden, das der Markt belohnt.
Weiß jemand, ob diese Änderung der Lizenz-/Geschäftsstrategie auch auf sold angewendet werden soll? sold ist mold für macOS.
https://github.com/bluewhalesystems/sold
https://twitter.com/davidecci/status/1665835119331135488
„Dieses Repository enthält die kostenlose Version des mold-Linkers. Wenn Sie eine kommerzielle Version mit macOS-Unterstützung suchen, besuchen Sie das Repository des sold-Linkers.“
Sie könnten für die Arbeit ordentlich Geld zahlen und die Welt besser machen.
Für Apple wäre das doch viel zu einfach.
Die Lizenz wechselt von AGPL zu MIT.
Aber wie sollte ein so hervorragender Handwerker eigentlich entlohnt werden, und warum passiert das noch nicht? Unternehmen sollten, unabhängig von ihrer Größe, ein gewisses Budget für zentrale Abhängigkeiten oder Tools bereitstellen und das auf ihrer offiziellen Website veröffentlichen. Es braucht wohl mehr von einer Art kultureller Norm.
Ich hatte vergessen, dass das ein schneller Linker war
„Mold 2.0.0 ist das neue Major Release unseres schnellen Linkers. In diesem Release haben wir die Lizenz von AGPL auf MIT umgestellt, mit dem Ziel, die Nutzerbasis zu vergrößern. Wer die Entwicklung verfolgt hat, weiß, dass das keine leichte Entscheidung war, weil wir versucht hatten, das Produkt über ein Dual-Licensing-Modell aus AGPL und kommerzieller Lizenz zu monetarisieren. Leider hat dieser Ansatz die Erwartungen nicht erfüllt. Die Lizenzänderung ist das Ergebnis, diese Realität zu akzeptieren. Wir wollen nicht weiter an einer Strategie festhalten, die nicht gut funktioniert hat.“
Das war furchtbar und auch eine miserable Art, mit Entwicklern umzugehen, die Software für das eigene OS schreiben.
Wir sind schon sehr lange daran gewöhnt, für Low-Level-Entwicklungswerkzeuge nicht zu bezahlen und stattdessen für Support zu zahlen. Dass überhaupt versucht wurde, so eine Lizenzierung zu machen, ist erstaunlich.
Über einen langen Zeitraum habe ich viele Diskussionen über schnelle Linker gesehen und mehrfach gehört, dass das Ersetzen eines Linkers durch einen schnelleren die Kompilierzeit deutlich reduziert habe, aber normalerweise wusste ich nicht genau, warum Linker langsam sind.
Es wäre schön, wenn das jemand erklären könnte.
Ein großer Teil der Performance-Gewinne entsteht dadurch, dass die Arbeit parallel verarbeitet wird, was auf modernen, leistungsstarken Multicore-CPUs zu großen Verbesserungen führt.
Wenn du mehr wissen willst: Rui hat einen guten Vortrag über Mold gehalten: https://www.youtube.com/watch?v=hAt3kCalE0Y
cat. Er müsste die Binärdateien nur aneinanderhängen, und fertig. In Zeiten rotierender Festplatten war Disk-I/O ein Problem, heute weniger.Der Teil, der Zeit kostet, ist das Umschreiben von Inhalten während des Vorgangs. Durch die Relocation-Tabellen zu gehen und Adressen in den Code einzutragen, ist billig, und Dead Stripping auf Section-Ebene ist auch recht billig; wenn man aber einzelne Basic Blocks innerhalb von Funktionen dead-strippen will, braucht das deutlich mehr Analyse und kostet Zeit.
Das Deduplizieren konstanter Strings ist eine gute Idee, aber dafür muss alles in irgendeine Form von Hash-Tabelle geleitet werden. Wenn man auch gemeinsame Suffixe teilen möchte, wird es noch mehr Arbeit.
Deduplizierung, Dead Stripping und das Umschreiben von Debug-Informationen kosten ebenfalls Zeit. Debug-Builds können mehrere GB DWARF enthalten, die umgeschrieben werden müssen.
Interessanterweise scheint es kein großer Kostenfaktor zu sein, dass Linker skriptbar sind und man ihnen ein Programm zur Interpretation übergeben kann. Vermutlich liegt das daran, dass diese Skripte ziemlich kurz und ihre Möglichkeiten in gewissem Maß begrenzt sind.
Historisch war lld vor allem deshalb sehr schnell, weil es kaum Debug-Informationen bearbeitet oder andere Deduplizierung vorgenommen hat. lld lief schnell, aber die ausgegebenen Binärdateien waren groß.
Ich bin seit einigen Jahren nicht mehr im Bereich Link-Performance aktiv und kenne den aktuellen Stand daher nicht gut. Insbesondere weiß ich nicht, wo mold oder lld heute im Spannungsfeld zwischen Ausgabequalität und eigener Performance stehen.
https://www.airs.com/blog/archives/38
„Noch einmal: Das Ziel ist Geschwindigkeit. In diesem Fall schneller als mein zweiter Linker. Dieser Linker ist über die Jahre erheblich langsamer geworden, als Unterstützung für ELF und Shared Libraries hinzugefügt wurde. Diese Unterstützung war nicht von Anfang an entworfen, sondern nachträglich angebaut. Zu den künftigen Plänen für den neuen Linker gehört auch Unterstützung für inkrementelles Linken, was ebenfalls eine weitere Möglichkeit ist, die Geschwindigkeit zu erhöhen.“
Man kann sich Apps aus den frühen Unix-Zeiten vorstellen: einfache Single-Purpose-Apps, vermutlich eine Quelldatei, ein Objekt, nur gegen libc gelinkt, und keine Dinge wie Shared Libraries.
Danach wuchs der Linker-Code organisch, als „unverzichtbare“ Features hinzukamen. Besonders in der Zeit, als rotierende Festplatten der Flaschenhals waren, war die Korrektheit der Features wichtiger als Geschwindigkeit.