La routine n'est chargée que lorsqu'elle est appelée. Toutes les routines sont conservées sur disque dans un format de chargement re-locatable. Le programme principal est chargé en mémoire et exécuté. C'est ce qu'on appelle la liaison dynamique.
Pourquoi cela s'appelle Dynamic Linking? Ne devrait-il pas s'agir d'un chargement dynamique, car la routine n'est pas chargée tant qu'elle n'est pas appelée dans le chargement dynamique alors que, comme dans la liaison dynamique, la liaison est reportée jusqu'au moment de l'exécution.
Chargement dynamique signifie le chargement de la bibliothèque (ou de tout autre binaire d'ailleurs) dans la mémoire pendant le chargement ou l'exécution.
Le chargement dynamique peut être imaginé comme étant similaire aux plugins, c'est-à-dire qu'un exe peut réellement s'exécuter avant le chargement dynamique (le chargement dynamique par exemple peut être créé à l'aide de l'appel LoadLibrary en C ou C++)
Liaison dynamique fait référence à la liaison qui est effectuée pendant le chargement ou l'exécution et non lorsque l'exe est créé.
En cas de liaison dynamique de l'éditeur de liens lors de la création de l'exe, le travail est minime. Pour que l'éditeur de liens dynamique fonctionne, il doit également charger les bibliothèques.
Par conséquent, les phrases que vous référez peuvent avoir un sens mais elles sont encore assez ambiguës car nous ne pouvons pas déduire le contexte dans lequel elles se réfèrent.Pouvez-vous nous indiquer où avez-vous trouvé ces lignes et dans quel contexte l'auteur parle-t-il?
Le chargement dynamique fait référence au mappage (ou moins souvent à la copie) d'un exécutable ou d'une bibliothèque dans la mémoire d'un processus après son démarrage. La liaison dynamique fait référence à la résolution de symboles - associant leurs noms à des adresses ou des décalages - après la compilation.
Voici le lien vers la réponse complète de Jeff Darcy chez quora
Cette réponse suppose que vous connaissez la commande Linux de base.
Sous Linux, il existe deux types de bibliothèques: statiques ou partagées.
Afin d'appeler des fonctions dans une bibliothèque statique, vous devez lier statiquement la bibliothèque à votre exécutable, résultant en un binaire statique.
Alors que pour appeler des fonctions dans une bibliothèque partagée, vous avez deux options.
La première option est la liaison dynamique, qui est couramment utilisée - lors de la compilation de votre exécutable, vous devez spécifier la bibliothèque partagée que votre programme utilise, sinon il ne compilera même pas. Lorsque votre programme démarre, c'est le travail du système d'ouvrir ces bibliothèques, qui peuvent être répertoriées à l'aide de la commande ldd
.
L'autre option est le chargement dynamique - lorsque votre programme s'exécute, c'est le travail du programme d'ouvrir cette bibliothèque. Ces programmes sont généralement liés à libdl, qui offre la possibilité d'ouvrir une bibliothèque partagée.
Extrait de Wikipedia:
Le chargement dynamique est un mécanisme par lequel un programme informatique peut, au moment de l'exécution, charger une bibliothèque (ou tout autre binaire) en mémoire, récupérer les adresses des fonctions et des variables contenues dans la bibliothèque, exécuter ces fonctions ou accéder à ces variables et décharger le bibliothèque de mémoire. C'est l'un des 3 mécanismes par lesquels un programme informatique peut utiliser un autre logiciel; les deux autres sont la liaison statique et la liaison dynamique. Contrairement à la liaison statique et à la liaison dynamique, le chargement dynamique permet à un programme informatique de démarrer en l’absence de ces bibliothèques, de découvrir les bibliothèques disponibles et d’acquérir potentiellement des fonctionnalités supplémentaires.
Si vous êtes toujours dans la confusion, lisez d'abord cet article génial: Anatomie des bibliothèques dynamiques Linux et construisez le exemple de chargement dynamique pour vous en faire une idée, puis revenez à ceci répondre.
Voici ma sortie de ldd ./dl
:
linux-vdso.so.1 => (0x00007fffe6b94000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f400f1e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f400ee10000)
/lib64/ld-linux-x86-64.so.2 (0x00007f400f400000)
Comme vous pouvez le voir, dl
est un exécutable dynamique qui dépend de libdl
, qui est lié dynamiquement par ld.so
, l'éditeur de liens dynamique Linux lorsque vous exécutez dl
. Il en va de même pour les 3 autres bibliothèques de la liste.
libm
n'apparaît pas dans cette liste, car il est utilisé comme une bibliothèque chargée dynamiquement. Il n'est pas chargé tant que ld
n'est pas invité à le charger.
Je lis également le "livre des dinosaures" et j'ai été confondu avec le concept de chargement et de liaison. Voici ma compréhension:
Le chargement et la liaison dynamiques se produisent lors de l'exécution et chargent tout ce dont ils ont besoin dans la mémoire.
La principale différence est que le chargement dynamique vérifie si la routine a été chargée par le chargeur tandis que la liaison dynamique vérifie si la routine est dans le mémoire.
Par conséquent, pour la liaison dynamique, il n'y a qu'une seule copie du code de bibliothèque dans la mémoire, ce qui peut ne pas être vrai pour le chargement dynamique. C'est pourquoi la liaison dynamique a besoin du support du système d'exploitation pour vérifier la mémoire des autres processus. Cette fonctionnalité est très importante pour les bibliothèques de sous-programmes de langue, qui sont partagées par de nombreux programmes.
L'éditeur de liens dynamique est un programme d'exécution qui charge et lie toutes les dépendances dynamiques d'un programme avant de commencer à exécuter ce programme. L'éditeur de liens dynamique trouvera les bibliothèques dynamiques dont un programme a besoin, les bibliothèques dont ces bibliothèques ont besoin (et ainsi de suite), puis il chargera toutes ces bibliothèques et s'assurera que toutes les références aux fonctions pointent correctement au bon endroit. Par exemple, même le programme "hello world" le plus basique nécessitera généralement que la bibliothèque C affiche la sortie et ainsi l'éditeur de liens dynamique chargera la bibliothèque C avant de charger le programme hello world et s'assurera que tous les appels à printf () vont au bon code.
Dynamic Loading:
Charger la routine dans la mémoire principale sur appel.
Dynamic Linking:
Charger la routine dans la mémoire principale pendant le temps d'exécution, si l'appel se produit avant le temps d'exécution, il est reporté au moment de l'exécution.
Chargement dynamique ne nécessite pas de support spécial du système d'exploitation, il est de la responsabilité du programmeur de vérifier si la routine à charger n'existe pas dans la mémoire principale.
Dynamic Linking nécessite un support spécial du système d'exploitation, la routine chargée via la liaison dynamique peut être partagée entre différents processus.
La routine n'est chargée que lorsqu'elle est appelée. Toutes les routines sont conservées sur disque dans un format de chargement re-locatable. Le programme principal est chargé en mémoire et exécuté. C'est ce qu'on appelle la liaison dynamique.
L'instruction est incomplète. "Le programme principal est chargé dans la mémoire principale et est exécuté." ne précise pas quand le programme est chargé.
Si nous considérons qu'il est chargé sur appel comme 1st spécifie alors son Dynamic Loading
Nous utilisons le chargement dynamique pour une meilleure utilisation de l'espace
Avantages
Il existe deux types de liaison statique et dynamique, lorsque le fichier de sortie est exécuté sans aucune dépendance (fichiers = bibliothèque) au moment de l'exécution, ce type de liaison est appelé statique, tandis que la dynamique est de deux types 1.Lien de chargement dynamique 2.Lien d'exécution dynamique Celles-ci sont décrites ci-dessous
La liaison dynamique fait référence à la liaison lors de l'exécution où les fichiers de bibliothèque sont amenés dans la mémoire principale et liés .. (Quel que soit l'appel de fonction, ils sont liés).
Dynamic Runtime Linking fait référence à la liaison lorsque cela est nécessaire, c'est-à-dire à chaque fois qu'un appel de fonction se produit à ce moment.