El gold
linker fue diseñado 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 binutils GNU "tradicional"). Como efecto secundario, es capaz de vincular programas muy grandes usando menos memoria que BFD ld
, presumiblemente porque hay menos capas de abstracción con las que lidiar y porque las estructuras de datos del enlazador 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 serie muy interesante 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 conducen a gold
. El escribe que
El enlazador en el que estoy trabajando ahora, llamado oro, será el tercero. Es exclusivamente un enlazador ELF. Una vez más, el objetivo es la velocidad, siendo 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 se parcheó en lugar de estar diseñado.
(El segundo enlazador es BFD ld
.)
El enlazador dorado fue escrito para hacer que el proceso de enlace sea considerablemente más rápido. Según el autor de oro Ian Lance Taylor
Por el momento, el oro solo tiene una 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 vincular archivos de objetos en formato ELF.
Con respecto a los problemas que enfrentó al usar el enlazador GNU, aquí hay una respuesta interesante a una pregunta similar sobre SO de Michael Adam:
El enlazador dorado 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. Véase, p. esta confirmación de Samba.
gold
contra ld
punto de referencia
He publicado un benchmark sintético concreto de ld vs gold 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 el 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, tiene que hacerse siempre, incluso si cambia solo un único archivo .cpp.
Entonces, un tiempo de enlace lento hace que el ciclo de desarrollo sea insoportable, y es probablemente la razón principal por la que Google invirtió recursos en él. Solo imagine las ganancias de esperar 10 segundos en lugar de 30 segundos por cada cambio de archivo trivial.
Las ganancias de tiempo del punto de referencia sintético también coincidieron con las ganancias reales que tuve en un proyecto complejo del mundo real (gem5), como también se menciona en esa respuesta.