Použil už někdo linker gold
? Chcete-li propojit poměrně velký projekt, musel jsem to použít na rozdíl od GNU ld
, který vyhodil několik chyb a nepodařilo se ho propojit.
Jak je gold
linker schopný propojit velké projekty, kde ld
selže? Existuje někde nějaký trik s pamětí?
Komentáře
Odpověď
Linker gold
byl navržen jako linker specifický pro ELF, s úmyslem vytvořit udržitelnější a rychlejší linker než BFD ld
(„tradiční“ linker GNU binutils). Jako vedlejší efekt je skutečně schopen propojit velmi velké programy s menší pamětí než BFD ld
, pravděpodobně proto, že je třeba řešit méně vrstev abstrakce a protože data linkeru struktury se přímo mapují do formátu ELF.
Nejsem si jistý, že existuje mnoho dokumentace, která konkrétně řeší rozdíly v designu mezi těmito dvěma linkery a jejich vliv na využití paměti. Existuje velmi zajímavá série článků o linkerech od Iana Lancea Taylora, autora různých linkerů GNU, který vysvětluje mnoho návrhových rozhodnutí vedoucích k gold
. píše , že
Linker, na kterém nyní pracuji, zvaný zlato, bude buď můj třetí. Jedná se výhradně o linker ELF. Cílem je opět rychlost, v tomto případě rychlejší než můj druhý linker. Tento linker byl v průběhu let výrazně zpomalen přidáním podpory pro ELF a pro sdílené knihovny. Tato podpora byla opravena, místo aby byla navržena.
(Druhý linker je BFD ld
.)
Komentáře
- bude název ' zlatý ' pocházet z čtení ' ld ' jako ' vést ' a zlato je zjevně cennější než olovo?
- @Aganju Ne, ' je to jen
go
s předponould
.
odpověď
zlatý linker byl napsán, aby se proces propojení podstatně zrychlil. Podle autorky zlata Ian Lance Taylor
V tuto chvíli má zlato pouze jednu významná výhoda oproti stávajícímu linkeru: je rychlejší. Na velkých programech v C ++ jsem měřil, že běží pětkrát rychleji.
Porovnává výkon zlatého linkeru s tradičním linkerem GNU. zlato (na rozdíl od linkeru GNU) nepoužívá knihovnu BFD ke zpracování souborů objektů.
Omezení zlata spočívá v tom, že (na rozdíl od linkeru GNU, který dokáže zpracovat mnoho typů souborů objektů), může propojovat pouze soubory objektů ve formátu ELF.
Pokud jde o problémy, s nimiž se setkáváte při používání GNU linker, zde je zajímavá odpověď na podobnou otázku týkající se SO od Michaela Adama:
Zlatý linker dokonce našel v našem kódu určité problémy se závislostmi, protože se zdá být správnější než klasický s ohledem na některé podrobnosti. Viz např. tento závazek Samba.
odpověď
gold
vs ld
měřítko
Konkrétní syntetický standard ld vs zlato jsem zveřejnil na: https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#53921263
Shrnutí výsledky: zlato bylo dvakrát až 3x rychlejší než ld.
Tento časový zisk může být obrovským měničem hry na komplexních projektech C ++ s šablonami mimo kontrolu a generováním kódu, protože krok propojení zahrnuje všechny soubory z projektu, a na rozdíl od kompilace, to musí být provedeno vždy, i když změníte jen jeden soubor .cpp.
Takže doba pomalého odkazu činí vývojový cyklus nesnesitelným a je pravděpodobně hlavním důvodem Google do toho vložil zdroje. Představte si zisky čekání 10 s místo 30 s na každou triviální změnu souboru.
Časové zisky syntetického benchmarku také souhlasily se skutečnými zisky, které jsem měl na složitém projektu reálného světa (gem5), jak je také uvedeno v této odpovědi.
Odpověď
V moderních systémech GNU / Linux jsou k dispozici tři linkery:
- ld , udržováno GNU binutils,
- zlato , udržováno GNU binutils, „stále v beta testu“,
- lld , vyvinut jako součást projektu LLVM.
Srovnávací testy rychlosti naleznete na: https://www.phoronix.com/scan.php?page=article&item=lld4-linux-tests&num=2 TL, DR: lld
je nejrychlejší, následuje gold
, za nímž následuje ld
Některé zdroje uvádějí, že zlatý projekt byl stagnuje a struktura balíčku ve Fedoře to odráží.
ld
byl zabit OoM.ld
může easilu spotřebovat mnoho GB RAM na velkých projektech v C ++, zatímcogold
a zejménalld
linkery jsou mnohem efektivnější z hlediska zdrojů.ld
došlo k chybě nedostatku paměti, ale zlatý linker to dokázal propojit