2010-08-13 21 views
59

¿Alguien ha intentado usar gold en lugar de ld?Reemplazando ld por oro - ¿Alguna experiencia?

goldpromises a ser mucho más rápido que ld, por lo que puede ayudar a acelerar los ciclos de pruebas para grandes aplicaciones en C++, pero que puede ser utilizado como reemplazo directo para ld?

Puede gcc/g++ llamar directamente gold.?

¿Hay algún error conocido o problema?

Aunque gold es parte de las binutils de GNU desde hace tiempo, he encontrado casi ninguna "historias de éxito" o incluso "Cómos" en la Web.

(actualización: añadido enlaces a la entrada de oro y un blog explicando que)

Respuesta

44

En estos momentos se está recopilando projec grande ts en Ubuntu 10.04. Aquí puede instalarlo e integrarlo fácilmente con el paquete binutils-gold (si elimina ese paquete, obtendrá su antiguo ld). Gcc automáticamente usará oro entonces.

Algunas experiencias:

  • oro no busca en /usr/local/lib
  • oro no asume libs como pthread o RT, tenía que añadir a mano
  • es más rápido y necesita menos memoria (el último es importante en grandes proyectos de C++ con mucho impulso, etc.)

Lo que no funciona: No puede compilar cosas del núcleo y, por lo tanto, no hay módulos del núcleo. Ubuntu hace esto automáticamente a través de DKMS si actualiza controladores propietarios como fglrx. Esto falla con ld-gold (tiene que quitar oro, reiniciar DKMS, reinstalar ld-gold.

+0

Gracias, creo que lo probaré; las restricciones que mencionas parecen no ser un problema en mi caso. – IanH

+0

+1: gracias por compartir experiencia. ¿Qué pasa con el rendimiento? – neuro

+9

es significativamente más rápido, especialmente al enlazar grandes bibliotecas estáticas con un binario, pero no hicimos ninguna medición difícil. – nob

8

puedan vincular ld a gold (en un directorio local binaria si ha ld instalado para evitar sobrescribir):

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

o

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

Como me tomó un poco de tiempo descubrir cómo usar selectivamente el oro (es decir, no todo el sistema usando un enlace simbólico), lo haré ... publicar la solución aquí se basa en http://code.google.com/p/chromium/wiki/LinuxFasterBuilds#Linking_using_gold

  1. Cree un directorio donde se puede poner un guión de cola de oro estoy usando ~/bin/gold/
  2. Ponga el siguiente script pegamento allí y el nombre de ~/bin/gold/ld:.

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

    Obviamente, hazlo ejecutable, chmod a+x ~/bin/gold/ld.

  3. Cambiar sus llamadas a gcc a gcc -B$HOME/bin/gold que hace mirada gcc en el directorio dado a los programas de ayuda como ld y por lo tanto utiliza la secuencia de comandos de cola en lugar de la ld-por defecto del sistema.

+1

¿Eso es necesario para qué sistema operativo? Como dijo Nob en su respuesta, para Ubuntu simplemente instale el paquete binutils de oro y el compilador lo usará de inmediato. Lo mismo para openSuse. – usr1234567

+6

Sí, es bastante fácil reemplazar ld en todo el sistema. Mi respuesta estaba especialmente orientada a cómo usar oro selectivamente. Y en ese caso, creo, es necesario para cualquier sistema operativo. –

+0

Puede hacer un enlace en lugar de un script de contenedor ... – vidstige

5

Como desarrollador de Samba, he estado usando el vinculador de oro casi exclusivamente en Ubuntu, Debian y Fedora desde hace varios años. Mi evaluación:

  • dorado es muchas veces (se siente: 5-10 veces) más rápido que el enlazador clásico.
  • Inicialmente, hubo algunos problemas, pero han ido desde aproximadamente Ubuntu 12.04.
  • El vinculador de oro incluso encontró algunos problemas de dependencia en nuestro código, ya que parece ser más correcto que el clásico con respecto a algunos detalles. Ver, p. this Samba commit.

No he usado oro selectivamente, pero he estado utilizando enlaces simbólicos o el mecanismo alternativo si la distribución lo proporciona.

7

Puede gcc/g ++ llamada directamente de oro.?

Sólo para complementar las respuestas: no hay opción de un gcc -fuse-ld=gold (ver gcc doc). Aunque, AFAIK, es posible configurar gcc durante la compilación de forma que la opción no tenga ningún efecto.

+3

'-fuse-ld = gold' no está completo.Si tiene que usar '-Wl, -fuse-ld = gold' como se usa en el tiempo del enlace. – Nawaz

Cuestiones relacionadas