A mai folosit cineva linker-ul gold
? Pentru a lega un proiect destul de mare, a trebuit să folosesc acest lucru spre deosebire de GNU ld
, care a aruncat câteva erori și nu a reușit să se lege.
Cum este link-ul gold
poate lega proiecte mari în care eșuează ld
? Există undeva un fel de șmecherie în memorie?
Comentarii
Răspuns
Linker-ul gold
a fost conceput ca un linker specific ELF, cu intenția de a produce un linker mai ușor de întreținut și mai rapid decât BFD ld
(linkerul „tradițional” GNU binutils). Ca efect secundar, este într-adevăr capabil să conecteze programe foarte mari folosind mai puțină memorie decât BFD ld
, probabil pentru că există mai puține straturi de abstractizare de care să se ocupe și pentru că datele linkerului structurile se mapează mai direct la formatul ELF.
Nu sunt sigur că există multă documentație care să abordeze în mod specific diferențele de design dintre cele două linkere și efectul lor asupra utilizării memoriei. Există o serie de articole despre linkere foarte interesante de Ian Lance Taylor, autorul diferitelor linkere GNU, care explică multe dintre deciziile de proiectare care duc la gold
. El scrie că
Linkerul pe care îl lucrez acum, numit aur, va fii al treilea meu. Este exclusiv un linker ELF. Încă o dată, obiectivul este viteza, în acest caz fiind mai rapid decât al doilea linker. Acest linker a fost încetinit semnificativ de-a lungul anilor prin adăugarea de suport pentru ELF și pentru bibliotecile partajate. Acest suport a fost aplicat în loc să fie proiectat.
(Al doilea linker este BFD ld
.)
Comentarii
- numele ' aur ' provin din citirea ' ld ' ca ' conduce ', iar aurul este în mod evident mai valoros decât plumbul?
- @Aganju Nu, ' este doar
go
prefixat lald
.
Răspuns
gold linker a fost scris pentru a face procesul de legătură considerabil mai rapid. Conform autorului de aur Ian Lance Taylor
În prezent, aurul are doar unul un avantaj semnificativ față de linkerul existent: este mai rapid. Pe programele mari C ++, l-am măsurat ca rulând de cinci ori mai repede.
El compară performanțele linkerului aur cu linkerul tradițional GNU. gold (spre deosebire de linkerul GNU) nu folosește biblioteca BFD pentru a procesa fișiere obiect.
Limita aurului este că (spre deosebire de linker-ul GNU care poate procesa mai multe tipuri de fișiere de obiecte) poate lega doar fișiere de obiecte în format ELF.
În ceea ce privește problemele cu care te-ai confruntat atunci când folosești GNU linker, iată un răspuns interesant la o întrebare similară pe SO de la Michael Adam:
Linkerul aur a găsit chiar și unele probleme de dependență în codul nostru, deoarece pare a fi mai corect decât cel clasic în ceea ce privește unele detalii. Vezi, de ex. acest Samba commit.
Răspuns
gold
vs ld
etalon
Am publicat un etalon sintetic concret de ld vs aur la: https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#53921263
Rezumatul rezultate: aurul a fost de 2 până la 3 ori mai rapid decât ld.
Acest câștig de timp poate fi un schimbător imens de jocuri pe proiecte complexe C ++ cu șabloane și control generat de cod, deoarece pasul de legătură implică toate fișierele din proiect și, spre deosebire de compilare, trebuie făcut întotdeauna, chiar dacă schimbați doar un singur fișier .cpp.
Deci, un timp de legătură lent face ciclul de dezvoltare insuportabil și este probabil principalul motiv Google a scufundat resurse în el. Imaginați-vă doar câștigurile de așteptare 10s în loc de 30s pentru fiecare schimbare banală de fișiere.
Câștigurile în timp ale parametrului sintetic sintetice au fost de asemenea de acord cu câștigurile reale pe care le-am avut într-un proiect complex din lumea reală (gem5), așa cum am menționat și în acest răspuns.
Există trei linkere disponibile pe sistemele GNU / Linux moderne:
- ld , menținut de GNU binutils,
- aur , menținut de GNU binutils, „încă în test beta”,
- lld , dezvoltat ca parte a proiectului LLVM.
Pentru etaloane de viteză, consultați: https://www.phoronix.com/scan.php?page=article&item=lld4-linux-tests&num=2 TL, DR: lld
este cel mai rapid, urmat de gold
, urmat de ld
Unele surse spun că proiectul aur a fost stagnează , iar structura pachetelor din Fedora reflectă acest lucru.
ld
a fost ucis de OoM.ld
poate ușor consuma mulți GB de ram pe proiecte mari C ++, în timp cegold
și mai aleslld
sunt mult mai eficiente din punct de vedere al utilizării resurselor.ld
a întâmpinat o eroare de memorie lipsită de memorie, dar linker-ul de aur a reușit să o conecteze