2010-08-13 20 views
59

Qualcuno ha provato a utilizzare gold anziché ld?Sostituire ld con oro - qualsiasi esperienza?

goldpromises di essere molto più veloce di ld, quindi potrebbe contribuire ad accelerare i cicli di prova per grandi applicazioni C++, ma può essere usato come rimpiazzo per ld?

Can gcc/g++ chiamare direttamente gold.?

Sono noti bug o problemi?

Anche se gold fa parte dei binutils GNU da un po 'di tempo, non ho trovato quasi "casi di successo" o addirittura "Howtos" nel Web.

(Aggiornamento: aggiunto link all'entrata oro e blog che spiegano che)

risposta

44

al momento di compilare più grande projec ts su Ubuntu 10.04. Qui puoi installarlo e integrarlo facilmente con il pacchetto binutils-gold (se rimuovi il pacchetto, ottieni il tuo vecchio ld). Gcc utilizzerà automaticamente l'oro quindi.

Alcune esperienze:

  • oro non cerca in /usr/local/lib
  • oro non si assume librerie come pthread o rt, ha dovuto aggiungerli manualmente
  • è più veloce e richiede meno memoria (più avanti è importante su grandi progetti C++ con molto boost ecc.)

Cosa non funziona: non può compilare il kernel e quindi nessun modulo del kernel. Ubuntu lo fa automaticamente tramite DKMS se aggiorna i driver proprietari come fglrx. Questo viene a mancare con ld-gold (è necessario rimuovere l'oro, riavviare DKMS, reinstallare ld-gold.

+0

Grazie, penso che ci proverò - le restrizioni menzionate sembrano non essere un problema nel mio caso. – IanH

+0

+1: grazie per aver condiviso l'esperienza. Che dire delle prestazioni? – neuro

+9

è notevolmente più veloce, soprattutto collegando insieme enormi librerie statiche a un unico binario, ma non abbiamo reso le misure difficili. – nob

8

è possibile collegare ld-gold (in una directory locali binari se si è ld installato per evitare di sovrascrivere):

ln -s `which gold` ~/bin/ld 

o

ln -s `which gold` /usr/local/bin/ld 
34

Come mi c'è voluto un po 'per scoprire come utilizzare in modo selettivo l'oro (cioè non a livello di sistema usando un link simbolico), io ... postare la soluzione qui si basa su http://code.google.com/p/chromium/wiki/LinuxFasterBuilds#Linking_using_gold

  1. Creare una directory dove si può mettere uno script colla oro sto usando ~/bin/gold/
  2. mettere il seguente script colla lì e denominarlo ~/bin/gold/ld:.

    #!/bin/bash 
    gold "[email protected]" 
    

    Ovviamente, renderlo eseguibile, chmod a+x ~/bin/gold/ld.

  3. Cambia le chiamate ad gcc-gcc -B$HOME/bin/gold che rende sguardo gcc nella directory data per i programmi di supporto come ld e utilizza quindi la sceneggiatura colla al posto del sistema-default ld.

+1

Ciò è necessario per quale sistema operativo? Come ha detto Nob nella sua risposta, per Ubuntu basta installare il pacchetto gold binutils e il compilatore lo utilizzerà immediatamente. Lo stesso per openSuse. – usr1234567

+6

Sì, è abbastanza facile sostituire ld a livello di sistema. La mia risposta è stata particolarmente orientata all'utilizzo dell'oro in modo selettivo. E in tal caso, penso, è necessario per qualsiasi sistema operativo. –

+0

Si potrebbe semplicemente fare un link invece di uno script wrapper ... – vidstige

5

Come sviluppatore Samba, ho utilizzato il linker oro quasi esclusivamente su Ubuntu, Debian, Fedora e da diversi anni a questa parte. La mia valutazione:

  • oro è molte volte (sentito: 5-10 volte) più veloce del linker classico.
  • Inizialmente, c'erano alcuni problemi, ma sono passati da circa Ubuntu 12.04.
  • Il linker oro ha anche riscontrato alcuni problemi di dipendenza nel nostro codice, poiché sembra essere più corretto di quello classico rispetto ad alcuni dettagli. Vedi, ad es. this Samba commit.

Non ho usato l'oro in modo selettivo, ma ho utilizzato i collegamenti simbolici o il meccanismo alternativo se la distribuzione lo fornisce.

7

Può gcc/g ++ direttamente chiamare oro.?

Solo per integrare le risposte: non c'è possibilità di un gcc -fuse-ld=gold (vedi gcc doc). Sebbene, AFAIK, è possibile configurare gcc durante la compilazione in modo che l'opzione non abbia alcun effetto.

+3

'-fuse-ld = gold' non è completo.Se devi usare '-Wl, -fuse-ld = gold' come è usato al momento del collegamento. – Nawaz

Problemi correlati