¿Alguien ha usado el enlazador gold antes? Para vincular un proyecto bastante grande, tuve que usar esto en lugar de GNU ld, que arrojó algunos errores y no pudo vincular.

Cómo es ¿El gold enlazador puede vincular proyectos grandes donde ld falla? ¿Hay algún tipo de truco de memoria en alguna parte?

Comentarios

  • ¿Cuáles fueron los errores? Es probable que ' se haya quedado sin memoria y ld haya sido eliminado por OoM. ld puede consumir fácilmente muchos GB de RAM en proyectos grandes de C ++, mientras que gold y especialmente lld son mucho más eficientes en cuanto a recursos.
  • ld experimentó un error de memoria insuficiente, pero el enlazador dorado pudo enlazarlo

Respuesta

El enlazador gold se diseñó como un enlazador específico de ELF, con la intención de producir un enlazador más fácil de mantener y más rápido que BFD ld (el enlazador GNU binutils “tradicional”). Como efecto secundario, de hecho es capaz de vincular programas muy grandes que usan menos memoria que BFD ld, presumiblemente porque hay menos capas de abstracción con las que lidiar y porque los datos del vinculador Las estructuras se asignan más directamente al formato ELF.

No estoy seguro de que haya mucha documentación que aborde específicamente las diferencias de diseño entre los dos enlazadores y su efecto en el uso de la memoria. Hay una muy interesante serie de artículos sobre enlazadores de Ian Lance Taylor, el autor de varios enlazadores GNU, que explica muchas de las decisiones de diseño que llevaron a gold. Él escribe que

El enlazador en el que estoy trabajando ahora, llamado gold, en ser mi tercero. Es exclusivamente un enlazador ELF. Una vez más, el objetivo es la velocidad, en este caso más rápido que mi segundo enlazador. Ese enlazador se ha ralentizado significativamente a lo largo de los años al agregar soporte para ELF y para bibliotecas compartidas. Este soporte fue parcheado en lugar de diseñado.

(El segundo vinculador es BFD ld).

Comentarios

  • ¿El nombre ' gold ' provienen de leer ' ld ' como ' lead ', ¿y el oro es obviamente más valioso que el plomo?
  • @Aganju No, es ' simplemente go con el prefijo ld.

Respuesta

El Gold Linker se escribió para acelerar considerablemente el proceso de enlace. Según el autor del oro Ian Lance Taylor

Por el momento, el oro solo tiene uno ventaja significativa sobre el enlazador existente: es más rápido. En programas grandes de C ++, he medido que se ejecuta cinco veces más rápido.

Está comparando el rendimiento del enlazador dorado con el enlazador GNU tradicional. gold (a diferencia del enlazador GNU) no usa la biblioteca BFD para procesar archivos de objetos.

La limitación de Gold es que (a diferencia del enlazador GNU que puede procesar muchos tipos de archivos de objetos), solo puede enlazar archivos de objetos en formato ELF.

Con respecto a los problemas que enfrentó al usar GNU enlazador, aquí hay una respuesta interesante a una pregunta similar sobre SO de Michael Adam:

El enlazador 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. Ej. esta confirmación de Samba.

Responder

gold frente a ld comparativa

He publicado una prueba comparativa sintética concreta de ld frente a oro en: https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#53921263

Resumen de resultados: el oro fue de 2 a 3 veces más rápido que ld.

Esta ganancia de tiempo puede cambiar enormemente las reglas del juego en proyectos complejos de C ++ con plantillas fuera de control y generación de código, porque el paso de enlace involucra todos los archivos del proyecto y, a diferencia de la compilación, debe hacerse siempre, incluso si cambia solo un archivo .cpp.

Por lo tanto, un tiempo de enlace lento hace que el ciclo de desarrollo sea insoportable, y probablemente sea la razón principal Google invirtió recursos en eso. Imagínense las ganancias de esperar 10 segundos en lugar de 30 segundos por cada cambio trivial de archivo.

Las ganancias de tiempo del punto de referencia sintético también coincidieron con las ganancias reales que obtuve en un proyecto complejo del mundo real (gem5), como también se menciona en esa respuesta.

Respuesta

Hay tres enlazadores disponibles en los sistemas GNU / Linux modernos:

  • ld , mantenido por GNU binutils,
  • gold , mantenido por GNU binutils, «aún en prueba beta»,
  • lld , desarrollado como parte del proyecto LLVM.

Para ver los puntos de referencia de velocidad, consulte: https://www.phoronix.com/scan.php?page=article&item=lld4-linux-tests&num=2 TL, DR: lld es el más rápido, seguido de gold, seguido de ld

Algunas fuentes dicen que el proyecto de oro ha sido estancado , y la estructura del paquete en Fedora refleja esto.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *