c++ - Sustituyendo ld por oro-¿Alguna experiencia?
linker migration (7)
¿Puede gcc / g ++ llamar directamente al oro?
Solo para complementar las respuestas: hay una opción de 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.
¿Alguien ha intentado usar gold
lugar de ld
?
gold
promises ser mucho más rápido que ld
, por lo que puede ayudar a acelerar los ciclos de prueba para aplicaciones grandes de C ++, pero ¿puede usarse como reemplazo directo para ld?
¿Puede gcc
/ g++
llamar directamente al gold
?
¿Hay algún error o problema conocido?
Aunque el gold
es parte de los binutils de GNU desde hace un tiempo, casi no he encontrado "historias de éxito" o incluso "Howtos" en la Web.
( Actualización: enlaces agregados a la entrada de oro y blog que lo explican )
Algunos proyectos parecen ser incompatibles con el oro, debido a algunas diferencias incompatibles entre ld y oro. Ejemplo: OpenFOAM, ver http://www.openfoam.org/mantisbt/view.php?id=685 .
Como desarrollador de Samba, he estado utilizando el enlazador de oro casi exclusivamente en Ubuntu, Debian y Fedora desde hace varios años. Mi evaluación:
- el oro 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, por ejemplo, este compromiso de Samba .
No he usado oro selectivamente, pero he usado enlaces simbólicos o el mecanismo alternativo si la distribución lo proporciona.
Como me tomó un poco de tiempo descubrir cómo usar selectivamente el oro (es decir, no para todo el sistema mediante un enlace simbólico), publicaré la solución aquí. Se basa en http://code.google.com/p/chromium/wiki/LinuxFasterBuilds#Linking_using_gold .
- Haga un directorio donde pueda colocar un guión de pegamento dorado. Estoy usando
~/bin/gold/
. Coloque la siguiente secuencia de comandos de pegamento allí y nómbrela
~/bin/gold/ld
:#!/bin/bash gold "$@"
Obviamente, hazlo ejecutable,
chmod a+x ~/bin/gold/ld
.Cambia tus llamadas a
gcc
porgcc -B$HOME/bin/gold
que hace que gcc busque en el directorio dado programas de ayuda comold
y, por lo tanto, utiliza el script de pegamento en lugar delld
predeterminado del sistema.
DragonFlyBSD cambió a oro como su enlazador predeterminado. Entonces parece estar listo para una variedad de herramientas.
Más detalles: http://phoronix.com/scan.php?page=news_item&px=DragonFlyBSD-Gold-Linker
Por el momento está compilando proyectos más grandes en Ubuntu 10.04. Aquí puede instalarlo e integrarlo fácilmente con el paquete binutils-gold
(si elimina ese paquete, obtiene su antiguo ld
). Gcc automáticamente usará oro entonces.
Algunas experiencias:
- gold no busca en
/usr/local/lib
- gold no supone libs como pthread o rt, tuvo que agregarlas a mano
- es más rápido y necesita menos memoria (lo posterior es importante en grandes proyectos de C ++ con mucho impulso, etc.)
Lo que no funciona: no puede compilar cosas del kernel y, por lo tanto, no hay módulos kernel. Ubuntu hace esto automáticamente a través de DKMS si actualiza controladores propietarios como fglrx. Esto falla con ld-gold
(tiene que eliminar oro, reiniciar DKMS, reinstalar ld-gold
.
Puede vincular ld
a gold
(en un directorio binario local si tiene ld
instalado para evitar sobrescribir):
ln -s `which gold` ~/bin/ld
o
ln -s `which gold` /usr/local/bin/ld