Qualcuno ha già utilizzato il linker gold? Per collegare un progetto abbastanza grande, ho dovuto utilizzare questo in contrasto con GNU ld, che ha generato alcuni errori e non è riuscito a collegarsi.

Comè il gold linker è in grado di collegare progetti di grandi dimensioni in cui ld non riesce? Cè qualche tipo di trucco della memoria da qualche parte?

Commenti

  • Quali erano gli errori? ' probabilmente hai esaurito la memoria e ld è stato ucciso da OoM. ld può facilmente consumare molti GB di RAM su grandi progetti C ++, mentre gold e soprattutto lld sono molto più efficienti in termini di risorse.
  • yes ld ha riscontrato un errore di memoria insufficiente, ma il linker gold è stato in grado di collegarlo

Risposta

Il linker gold è stato progettato come un linker specifico per ELF, con lintenzione di produrre un linker più manutenibile e veloce rispetto a BFD ld (il linker GNU binutils “tradizionale”). Come effetto collaterale, è effettivamente in grado di collegare programmi molto grandi utilizzando meno memoria di BFD ld, presumibilmente perché ci sono meno livelli di astrazione da gestire e perché i dati del linker le strutture vengono mappate più direttamente nel formato ELF.

Non sono sicuro che ci sia molta documentazione che affronti specificamente le differenze di progettazione tra i due linker e il loro effetto sulluso della memoria. Esiste una serie di articoli sui linker molto interessante di Ian Lance Taylor, lautore dei vari linker GNU, che spiega molte delle decisioni di progettazione che hanno portato a gold. Egli scrive che

Il linker su cui sto lavorando, chiamato gold, su essere il mio terzo. È esclusivamente un linker ELF. Ancora una volta, lobiettivo è la velocità, in questo caso essere più veloce del mio secondo linker. Quel linker è stato notevolmente rallentato nel corso degli anni aggiungendo il supporto per ELF e per le librerie condivise. Questo supporto è stato patchato piuttosto che progettato.

(Il secondo linker è BFD ld.)

Commenti

  • sarebbe il nome ' gold ' proviene dalla lettura di ' ld ' come ' lead ' e loro è ovviamente più prezioso del piombo?
  • @Aganju No, ' è solo go con prefisso ld.

Risposta

Il gold linker è stato scritto per rendere il processo di collegamento notevolmente più veloce. Secondo lauther delloro Ian Lance Taylor

Al momento loro ne ha solo uno vantaggio significativo rispetto al linker esistente: è più veloce. Su grandi programmi C ++, ho misurato che funziona cinque volte più veloce.

Sta confrontando le prestazioni del linker gold con il linker GNU tradizionale. gold (a differenza del linker GNU) non usa la libreria BFD per elaborare i file oggetto.

La limitazione di gold è che (a differenza del linker GNU che può elaborare molti tipi di file oggetto) può solo collegare file oggetto in formato ELF.

Per quanto riguarda i problemi che hai dovuto affrontare usando GNU linker, ecco una risposta interessante a una domanda simile su SO di Michael Adam:

Il gold linker ha anche riscontrato alcuni problemi di dipendenza nel nostro codice, dato che sembra essere più corretto di quello classico rispetto ad alcuni dettagli. Vedi, ad es. questo commit Samba.

Risposta

gold vs ld benchmark

Ho pubblicato un benchmark sintetico concreto di ld vs gold su: https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#53921263

Riepilogo di risultati: loro era da 2x a 3 volte più veloce di ld.

Questo guadagno di tempo può essere un enorme cambiamento di gioco su progetti C ++ complessi con modelli fuori controllo e generazione di codice, perché il passaggio di collegamento coinvolge tutti i file dal progetto e, a differenza della compilazione, deve essere fatto sempre, anche se si modifica un solo file .cpp.

Quindi un tempo di collegamento lento rende il ciclo di sviluppo insopportabile, ed è probabilmente il motivo principale Google ha investito risorse in esso. Immagina solo i vantaggi di aspettare 10 secondi anziché 30 per ogni banale cambio di file.

I guadagni di tempo del benchmark sintetico concordavano anche con i guadagni effettivi che ho avuto su un complesso progetto del mondo reale (gem5), come menzionato anche in quella risposta.

Risposta

Sono disponibili tre linker sui moderni sistemi GNU / Linux:

  • ld , mantenuto da GNU binutils,
  • gold , mantenuto da GNU binutils, “ancora in beta test”,
  • lld , sviluppato come parte del progetto LLVM.

Per i benchmark di velocità, vedi: https://www.phoronix.com/scan.php?page=article&item=lld4-linux-tests&num=2 TL, DR: lld è il più veloce, seguito da gold, seguito da ld

Alcune fonti dicono che il progetto gold è stato stagnante e la struttura del pacchetto in Fedora lo riflette.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *