Czy ktoś wcześniej używał linkera gold
? Aby zlinkować dość duży projekt, musiałem użyć tego w przeciwieństwie do GNU ld
, który wyrzucał kilka błędów i nie udało się go połączyć.
Jak to jest konsolidator gold
może łączyć duże projekty, gdy ld
zawodzi? Czy jest gdzieś jakaś sztuczka związana z pamięcią?
Komentarze
Odpowiedź
Linker gold
został zaprojektowany jako linker specyficzny dla ELF, z zamiarem stworzenia łatwiejszego w utrzymaniu i szybszego konsolidatora niż BFD ld
(„tradycyjny” linker GNU binutils). Efektem ubocznym jest rzeczywiście możliwość łączenia bardzo dużych programów przy użyciu mniejszej ilości pamięci niż BFD ld
, prawdopodobnie dlatego, że istnieje mniej warstw abstrakcji, z którymi trzeba sobie poradzić, a dane linkera struktury odwzorowują się bardziej bezpośrednio na format ELF.
Nie jestem pewien, czy istnieje wiele dokumentacji, która konkretnie odnosi się do różnic projektowych między dwoma linkerami i ich wpływu na użycie pamięci. Istnieje bardzo interesująca seria artykułów o linkerach autorstwa Iana Lancea Taylora, autora różnych linkerów GNU, która wyjaśnia wiele decyzji projektowych prowadzących do gold
. On pisze , że
Łącznik, z którym teraz pracuję, zwany złotem, na woli bądź moją trzecią. Jest to wyłącznie linker ELF. Po raz kolejny celem jest szybkość, w tym przypadku szybsza niż mój drugi linker. Ten linker został znacznie spowolniony przez lata przez dodanie obsługi ELF i bibliotek współdzielonych. Ta obsługa została załatana, a nie zaprojektowana.
(Drugi linker to BFD ld
.)
Komentarze
- czy nazwa ' złota ' pochodzą z czytania ' ld ' jako ' lead ', a złoto jest oczywiście cenniejsze niż ołów?
- @Aganju Nie, to ' to po prostu
go
z prefiksemld
.
Odpowiedź
złoty linker został napisany, aby znacznie przyspieszyć proces łączenia. Według złotego autora Ian Lance Taylor
W tej chwili złoto ma tylko jeden znacząca przewaga nad istniejącym konsolidatorem: jest szybsza. W przypadku dużych programów C ++ oceniłem, że działa pięć razy szybciej.
Porównuje on wydajność złotego linkera z tradycyjnym konsolidatorem GNU. gold (w przeciwieństwie do konsolidatora GNU) nie używa biblioteki BFD do przetwarzania plików obiektowych.
Ograniczeniem złota jest to, że (w przeciwieństwie do konsolidatora GNU, który może przetwarzać wiele typów plików obiektowych) może on łączyć tylko pliki obiektowe w formacie ELF.
Jeśli chodzi o problemy, z którymi borykasz się podczas używania GNU linker, oto interesująca odpowiedź na podobne pytanie w SO od Michaela Adama:
Złoty linker znalazł nawet pewne problemy z zależnościami w naszym kodzie, ponieważ pod względem niektórych szczegółów wydaje się być bardziej poprawny niż klasyczny. Zobacz np. to zatwierdzenie Samby.
Odpowiedź
gold
a ld
test porównawczy
Opublikowałem konkretny syntetyczny test porównawczy ld w porównaniu ze złotem pod adresem: https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#53921263
Podsumowanie wyniki: złoto było 2x do 3x razy szybsze niż ld.
Ten czas może być ogromnym przełomem w złożonych projektach C ++ z niekontrolowanymi szablonami i generowaniem kodu, ponieważ krok łącza obejmuje wszystkie pliki z projektu, w przeciwieństwie do kompilacji, trzeba to robić zawsze, nawet jeśli zmieniasz tylko jeden plik .cpp.
Więc wolny czas linkowania sprawia, że cykl rozwoju jest nie do zniesienia i jest to prawdopodobnie główny powód Google zatopił w nim zasoby. Wyobraź sobie korzyści wynikające z czekania 10 zamiast 30 sekund na każdą banalną zmianę pliku.
Zyski czasu w syntetycznym benchmarku zgadzały się również z faktycznymi zyskami, jakie osiągnąłem na złożonym projekcie w świecie rzeczywistym (gem5), jak również wspomniano w tej odpowiedzi.
Odpowiedź
W nowoczesnych systemach GNU / Linux dostępne są trzy konsolidatory:
- ld , utrzymywany przez GNU binutils,
- gold , utrzymywany przez GNU binutils, „nadal w fazie testów beta”,
- lld , opracowany w ramach projektu LLVM.
Testy szybkości, patrz: https://www.phoronix.com/scan.php?page=article&item=lld4-linux-tests&num=2 TL, DR: lld
jest najszybsze, a za nim gold
, a następnie ld
Niektóre źródła podają, że złoty projekt był stagnacja , a struktura pakietów w Fedorze to odzwierciedla.
ld
został zabity przez OoM.ld
może łatwo zużywać wiele GB pamięci RAM w dużych projektach C ++, podczas gdygold
, a zwłaszczalld
linkery są znacznie bardziej wydajne pod względem zasobów.ld
napotkał błąd braku pamięci, ale złoty linker był w stanie go połączyć.