Question

J'ai toujours été troublé par le fonctionnement de l'éditeur de liens et c'est un sujet difficile à rechercher.

Pour illustrer ma question et pour fournir un cadre de réponse, je vais écrire ce que je sais (ou pense connaître) à ce jour. J'ai peut-être très tort. :)

Tout d’abord, chaque fichier .cpp est intégré à un fichier intermédiaire (.o pour Posix / ELF et .obj pour Win / PE, je crois). Ce fichier intermédiaire contient tous les symboles définis par le fichier .cpp à partir duquel il a été créé. Il contient des instructions sur les liens externes à résoudre correctement. En complément, les systèmes Posix vous permettent de combiner les fichiers .o dans un fichier .a (qui ne semble rien faire d’autre que combiner? Quelle commande le fait?). Est-ce que .lib est l’équivalent Win / PE du fichier Posix .a?

Ensuite, les fichiers intermédiaires sont liés, les dépendances externes sont résolues et vous avez votre exécutable. Est-ce que je manque des étapes?

Merci!

Était-ce utile?

La solution

Voici quelques pièces du puzzle:

  • ar (1) est utilisé pour créer des fichiers .a. Ils sont similaires aux fichiers tar (1) ou zip (éventuellement avec un index pour rechercher un fichier objet par nom de symbole)
  • L'éditeur de liens copie ensemble les sections de fichiers objets (texte, données, bss). Pour GNU ld, la copie précise de sections peut être contrôlée à l'aide d'un script de l'éditeur de liens (par exemple, copier toutes les sections à partir de fichiers .o contenant le texte dans leur nom dans une section de texte unique.)
  • L'éditeur de liens effectue également des relocalisations: instructions de correction (saut et chargement de données) avec les adresses cibles respectives, une fois que la valeur d'un symbole est connue. Dans certains cas, cela ne peut pas être fait au moment de la liaison. L'éditeur de liens copie / ajuste les enregistrements de déplacement des fichiers .o dans l'exécutable final.
  • la fenêtre .lib remplit deux fonctions: une bibliothèque statique (.lib) est similaire à une bibliothèque .a. Une bibliothèque d'importation (.lib) ne contient pas le code réel, mais uniquement des listes de symboles. L'éditeur de liens peut résoudre les symboles de la bibliothèque d'importation, mais sait ensuite qu'il doit placer une référence au fichier .dll correspondant dans l'exécutable. Sous Unix / ELF, le fichier .so contient à la fois le code et la table des symboles.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top