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

  • Jakie były błędy? ' prawdopodobnie zabrakło Ci pamięci i ld został zabity przez OoM. ld może łatwo zużywać wiele GB pamięci RAM w dużych projektach C ++, podczas gdy gold, a zwłaszcza lld linkery są znacznie bardziej wydajne pod względem zasobów.
  • tak ld napotkał błąd braku pamięci, ale złoty linker był w stanie go połączyć.

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 prefiksem ld.

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *