web-dev-qa-db-fra.com

Qu'est-ce que le lieur d'or?

Quelqu'un a-t-il déjà utilisé l'éditeur de liens gold? Pour lier un projet assez volumineux, j'ai dû utiliser ceci par opposition à GNU ld, qui a généré quelques erreurs et n'a pas réussi à lier.

Comment l'éditeur de liens gold est-il capable de lier de grands projets où ld échoue? Y a-t-il une sorte de ruse de mémoire quelque part?

25
placid chat

L'éditeur de liens gold a été conçu comme un éditeur de liens spécifique à ELF, avec l'intention de produire un éditeur de liens plus facile à entretenir et plus rapide que BFD ld (le "traditionnel" GNU = binutils linker). Comme effet secondaire, il est en effet capable de lier de très gros programmes en utilisant moins de mémoire que BFD ld, probablement parce qu'il y a moins de couches d'abstraction à traiter, et parce que les structures de données du lieur mappez plus directement au format ELF.

Je ne suis pas sûr qu'il y ait beaucoup de documentation qui traite spécifiquement des différences de conception entre les deux éditeurs de liens et de leur effet sur l'utilisation de la mémoire. Il y a un très intéressant série d'articles sur les linkers par Ian Lance Taylor, l'auteur des divers GNU linkers, qui explique bon nombre des décisions de conception menant à gold. Il écrit que

L'éditeur de liens sur lequel je travaille maintenant, appelé or, sera mon troisième. Il s'agit exclusivement d'un éditeur de liens ELF. Encore une fois, l'objectif est la vitesse, dans ce cas, plus rapide que mon deuxième éditeur de liens. Ce lieur a été considérablement ralenti au fil des ans en ajoutant la prise en charge d'ELF et des bibliothèques partagées. Ce support a été corrigé plutôt que conçu.

(Le deuxième éditeur de liens est BFD ld.)

27
Stephen Kitt

Le lieur d'or a été écrit pour accélérer considérablement le processus de liaison. Selon l'auteur d'or Ian Lance Taylor

Pour le moment, l'or n'a qu'un avantage significatif sur l'éditeur de liens existant: il est plus rapide. Sur les grands programmes C++, je l'ai mesuré comme fonctionnant cinq fois plus vite.

Il compare les performances de l'éditeur de liens or avec l'éditeur de liens traditionnel GNU. Or (contrairement à l'éditeur de liens GNU)) n'utilise pas la bibliothèque BFD pour traiter les fichiers d'objets.

La limite de l'or est que (contrairement à GNU qui peut traiter de nombreux types de fichiers objets), il ne peut lier que les fichiers objets au format ELF.

Concernant les problèmes que vous avez rencontrés lors de l'utilisation de GNU, voici une réponse intéressante à une question similaire sur SO de Michael Adam:

Le lieur d'or a même trouvé des problèmes de dépendance dans notre code, car il semble être plus correct que le classique en ce qui concerne certains détails. Voir, par exemple ce commit Samba.

13
suspectus

gold vs ld benchmark

J'ai publié un benchmark synthétique concret de ld vs gold sur: https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#5392126

Résumé des résultats: l'or était 2x à 3 fois plus rapide que le ld.

Ce gain de temps peut être un énorme changement de jeu sur les projets C++ complexes avec des modèles hors contrôle et la génération de code, car l'étape de liaison implique tous les fichiers du projet, et contrairement à la compilation, elle doit être effectuée toujours, même si vous changez juste un seul fichier .cpp.

Ainsi, un temps de liaison lent rend le cycle de développement insupportable et est probablement la principale raison pour laquelle Google y a investi des ressources. Imaginez simplement les gains d'attendre 10s au lieu de 30s pour chaque changement de fichier trivial.

Les gains de temps de l'indice de référence synthétique concordaient également avec les gains réels que j'avais sur un projet complexe du monde réel (gem5), comme également mentionné dans cette réponse.

Il existe trois éditeurs de liens disponibles sur les systèmes GNU/Linux modernes:

  • ld , maintenu par GNU binutils,
  • gold , maintenu par GNU binutils, "toujours en beta test",
  • lld , développé dans le cadre du projet LLVM.

Pour les repères de vitesse, voir: https://www.phoronix.com/scan.php?page=article&item=lld4-linux-tests&num=2 TL, DR: lld est le plus rapide , suivi de gold, suivi de ld

Certaines sources affirment que le projet aurifère a été stagnation , et la structure du package dans Fedora reflète cela.

1
Syfer Polski