Ce n'linkers faire?
Je me suis toujours demandé. Je sais que les compilateurs de convertir le code que vous écrivez dans les fichiers binaires, mais ce n'linkers faire? Ils ont toujours été un mystère pour moi.
J'ai à peu près à comprendre ce que 'lier' est. C'est lorsque des références à des bibliothèques et des cadres sont ajoutés à la binaire. Je ne comprends rien au-delà. Pour moi, il "fonctionne". J'ai aussi comprendre les principes de base de la liaison dynamique, mais rien de trop profonde.
Quelqu'un pourrait-il expliquer les termes?
Vous devez vous connecter pour publier un commentaire.
De comprendre les linkers, il permet d'abord de comprendre ce qui se passe "sous le capot" lorsque vous convertissez un fichier source (comme un C ou C++ fichier) dans un fichier exécutable (un fichier exécutable est un fichier qui peuvent être exécutées sur votre machine, ou quelqu'un d'autre de la machine exécutant le même architecture de la machine).
Sous le capot, quand un programme est compilé, le compilateur convertit le fichier source dans l'objet du byte-code. Ce byte code (parfois appelé code de l'objet) est mnémoniques des instructions que seul votre architecture d'ordinateur comprend. Traditionnellement, ces fichiers ont une .OBJ extension.
Après le fichier objet est créé, l'éditeur de liens entre en jeu. Le plus souvent, un véritable programme qui ne fait rien d'utile aurez besoin de faire référence à d'autres fichiers. En C, par exemple, un programme simple pour imprimer votre nom à l'écran serait composé de:
Lorsque le compilateur compiler votre programme dans un fichier obj, il met tout simplement une référence à la
printf
fonction. L'éditeur de liens résout cette référence. La plupart des langages de programmation disposent en série d'une bibliothèque de routines pour couvrir les trucs de base prévu à partir de cette langue. L'éditeur de liens de liens de votre fichier OBJ avec cette bibliothèque standard. L'éditeur de liens peut aussi le lien de votre fichier OBJ avec d'autres fichiers OBJ. Vous pouvez créer d'autres fichiers OBJ qui ont des fonctions qui peuvent être appelées par un autre fichier OBJ. Le linker fonctionne presque comme un traitement de texte est un copier-coller. Il "copies" de toutes les fonctions nécessaires pour que votre programme de références et crée un seul fichier exécutable. Parfois, d'autres bibliothèques qui sont copiées dépendent encore d'autres OBJ ou des fichiers de la bibliothèque. Parfois, un éditeur de liens doit être assez récursive pour faire son travail.Noter que tous les systèmes d'exploitation de créer un seul fichier exécutable. Windows, par exemple, utilise les Dll de garder toutes ces fonctions dans un seul fichier. Cela réduit la taille de votre exécutable, mais rend votre exécutable dépend de ces Dll spécifiques. DOS habitude d'utiliser des choses que l'on appelle des Superpositions (.Les fichiers OVL). Cela a eu beaucoup de buts, mais l'un était de garder les fonctions les plus couramment utilisées ensemble dans 1 fichier (un autre but, il a servi, dans le cas où vous poseriez la question, était d'être capable de s'adapter à de grandes des programmes en mémoire. DOS a une limitation dans la mémoire et les superpositions pourrait être "déchargé" de la mémoire et d'autres superpositions pourrait être "chargé" sur le dessus de ce mémoire, d'où le nom de "couches"). Linux a des bibliothèques partagées, qui est essentiellement la même idée que Dll (noyau dur Linux les gars, je sais me dire il y a BEAUCOUP de GRANDES différences).
Espère que cela vous aide à comprendre!
Adresse de réinstallation exemple minimal
Adresse de réinstallation est l'une des fonctions essentielles de la liaison.
Donc, nous allons avoir un regard sur la façon dont il fonctionne avec un exemple minimal.
0) Introduction
Résumé: la relocalisation des modifications de la
.text
section de l'objet des fichiers à traduire:Cela doit être fait par l'éditeur de liens, car le compilateur ne voit qu'un fichier d'entrée à un moment, mais il faut savoir à propos de tous les fichiers objet à la fois de décider comment:
.text
et.data
sections de plusieurs fichiers objets- Requis: compréhension minimale de:
Liaison n'a rien à voir avec le C ou le C++ en particulier: les compilateurs tout simplement de générer des fichiers de l'objet. L'éditeur de liens, puis prend comme entrée sans jamais savoir quelle langue compilés. Il pourrait aussi bien être Fortran.
Afin de réduire la croûte, nous allons étudier une MSNA x86-64 Linux ELF bonjour tout le monde:
compilé et assemblé avec:
avec MSNA 2.10.09.
1) .texte de .o
Nous avons d'abord décompiler le
.text
section du fichier de l'objet:qui donne:
l'essentiel lignes sont:
qui doit se déplacer à l'adresse du hello world chaîne dans le
rsi
registre, qui est passé à l'écriture de l'appel système.Mais attendez! Comment le compilateur sait d'où
"Hello world!"
finira dans la mémoire lorsque le programme est chargé?Bien, il ne peut pas, en particulier après que nous lien un tas de
.o
fichiers avec plusieurs.data
sections.Seulement l'éditeur de liens ne peut le faire que depuis seulement il va avoir toutes ces fichiers objets.
De sorte que le compilateur juste:
0x0
sur la sortie compiléeCette "information supplémentaire" est contenu dans la
.rela.text
section de l'objet fichier2) .rela.texte
.rela.text
est l'acronyme de "relocalisation de l' .section de texte".Le mot de réinstallation est utilisé parce que l'éditeur de liens de déménager l'adresse de l'objet dans l'exécutable.
Nous pouvons démonter le
.rela.text
section avec:qui contient;
Le format de cette section est fixé documenté à: http://www.sco.com/developers/gabi/2003-12-17/ch4.reloc.html
Chaque entrée indique à l'éditeur de liens sur une adresse qui doit être déplacé, ici, nous avons seulement une pour la chaîne.
En simplifiant un peu, pour cette ligne en particulier, nous avons les informations suivantes:
Offset = C
: qu'est-ce que le premier octet de la.text
que cette entrée changements.Si nous regardons en arrière à la décompilation d'un texte, il est exactement à l'intérieur de la critique
movabs $0x0,%rsi
, et ceux qui connaissent x86-64 codage d'instruction remarquerez que ce code de la 64 bits de l'adresse de la partie de l'instruction.Name = .data
: l'adresse des points de la.data
sectionType = R_X86_64_64
, qui précise ce qu'est exactement ce calcul doit être fait pour traduire l'adresse.Ce champ est effectivement processeur dépend, et donc documenté sur le Système AMD64 V ABI extension la section 4.4 "Relocalisation".
Que le document dit que
R_X86_64_64
n':Field = word64
: 8 octets, donc la00 00 00 00 00 00 00 00
à l'adresse0xC
Calculation = S + A
S
est valeur à l'adresse déplacée, donc00 00 00 00 00 00 00 00
A
est le addend qui est0
ici. C'est un domaine de la relocalisation de l'entrée.Donc
S + A == 0
et nous aurons déménagé à la première adresse de la.data
section.3) .texte de .hors
Regardons maintenant la zone de texte de l'exécutable
ld
généré pour nous:donne:
Donc, la seule chose qui a changé à partir du fichier de l'objet sont les lignes critiques:
qui pointent désormais à l'adresse
0x6000d8
(d8 00 60 00 00 00 00 00
en little-endian) au lieu de0x0
.Est-ce le bon endroit pour le
hello_world
chaîne?De décider, nous devons vérifier le programme en-têtes, qui dites-Linux, où à la charge de chaque section.
Nous les démonter avec:
qui donne:
Cela nous dit que le
.data
section, qui est le deuxième, commence àVirtAddr
=0x06000d8
.Et la seule chose sur la section de données est notre hello world chaîne.
Niveau Bonus
PIE
liens: Qu'est-ce que l'-fPIE option indépendante de la position des exécutables dans le gcc et ld?Dans les langues, comme "C", les modules de code sont traditionnellement compilé séparément dans des gouttes de code objet, qui est prêt à s'exécuter dans tous les domaines autres que celui de toutes les références que le module de l'extérieur de lui-même (c'est à dire à des bibliothèques ou à d'autres modules) n'ont pas encore été résolu (c'est à dire qu'ils sont vides, en attente de quelqu'un qui vient le long et en prenant toutes les connexions).
Ce que l'éditeur de liens n'est de regarder tous les modules ensemble, regarde ce que chaque module doit se connecter à l'extérieur de lui-même, et de regarder toutes les choses qu'il est de l'exportation. Il fixe alors que tout, et produit un exécutable final, qui peut ensuite être exécuté.
Où la liaison dynamique est également en cours, la sortie de l'éditeur de liens est encore pas capable de fonctionner - il y a encore quelques références à des bibliothèques externes pas encore résolu, et ils résolus par le système d'exploitation au moment du chargement de l'application (ou peut-être même plus tard au cours de l'exécution).
Lorsque le compilateur génère un fichier de l'objet, il comprend des entrées pour les symboles sont définis dans ce fichier de l'objet, et des références à des symboles qui ne sont pas définies dans ce fichier de l'objet. L'éditeur de liens prend ceux et met donc (quand tout fonctionne à droite) toutes les références externes à partir de chaque fichier sont satisfaits par des symboles qui sont définies dans d'autres fichiers de l'objet.
Puis, il combine tous ces fichiers objets ensemble et attribue les adresses de chacun des symboles, et où l'un fichier objet a une référence externe à un autre objet fichier, il remplit dans l'adresse de chaque symbole partout où il est utilisé par un autre objet. Dans un cas typique, il va également construire un tableau de toutes les adresses absolues utilisées, de sorte que le chargeur peut/va "corriger" les adresses lorsque le fichier est chargé (c'est à dire, il va ajouter l'adresse de chargement de base pour chacune de ces adresses, de sorte qu'ils se réfèrent tous à la bonne adresse mémoire).
Tout à fait un peu de moderne linkers peut également effectuer certaines (dans quelques cas, une beaucoup) d'autres "trucs", comme l'optimisation du code dans les moyens qui ne sont possibles qu'une fois tous les modules sont visibles (par exemple, la suppression de fonctionnalités qui ont été inclus parce qu'il a été possible qu'un autre module pourrait les appeler, mais une fois que tous les modules sont mis ensemble, il est évident que rien ne les appelle).