# Dynamic Link Library

Une Dynamic Link Library (en français, bibliothèque de liens dynamiques$^,$$^,$) est une bibliothèque logicielle dont les fonctions sont chargées en mémoire par un programme, au besoin, lors de son exécution, par opposition aux bibliothèques logicielles statiques ou partagées dont les fonctions sont chargées en mémoire avant le début de l'exécution du programme.
.dll est une extension de nom de fichier utilisée par des fichiers contenant une Dynamic Link Library.
Ces bibliothèques logicielles ont été inventées dans Multics en 1964 et existent dans Windows depuis 1985$^,$. Elles constituent une des fondations des systèmes d'exploitation Windows et sont utilisées pour les interfaces de programmation, les pilotes, les widgets et les polices de caractères.

## Fonctionnement

Un programme informatique est construit à partir d'un ensemble de fichiers source contenant des fonctions. Les bibliothèques logicielles sont des lots de fonctions stockées dans des fichiers. Une bibliothèque logicielle contient généralement un ensemble de fonctions autour du même sujet. Par cette technique, une modification subséquente d'une des fonctions de la bibliothèque nécessite de la re-créer, sans qu'il soit nécessaire de re-créer la totalité de l'application.
Cette technique nécessite de charger en mémoire les fichiers de bibliothèque en même temps que le programme qui les utilise, ensuite de quoi un programme — l'éditeur de liens — rend l'application opérationnelle en tissant des liens entre les différents fichiers.
Les bibliothèques logicielles peuvent être :

### Statiques

Une bibliothèque statique est incorporée dans un programme et l'édition de liens est effectuée pendant sa construction. Lorsqu'une bibliothèque statique est modifiée, chaque programme qui l'utilise doit être reconstruit pour incorporer les modifications ;

### Partagées

Une bibliothèque partagée n'est pas incorporée dans les programmes qui l'utilisent, mais est reliée à ces programmes lors de leur chargement, c'est-à-dire immédiatement avant l'exécution du programme. Une bibliothèque partagée peut être utilisée par de nombreux programmes et une modification de la bibliothèque ne nécessite pas de reconstruction des programmes, du moment que l'interface de programmation de la bibliothèque ne change pas ;

### Dynamiques (DLL)

Les bibliothèques dynamiques sont identiques aux bibliothèques partagées, mais sont utilisées d'une manière différente. De telles bibliothèques sont reliées à l'application lorsque celle-ci en a besoin. Les programmes qui les utilisent comportent les instructions nécessaires au chargement et à la liaison.
Dans la technique de la liaison dynamique utilisée par les DLL, l'opération de liaison est exécutée en deux temps : tout d'abord, au moment de la construction de l'application, l'éditeur de liens crée des connecteurs, puis au chargement — immédiatement avant l'exécution de l'application — les connecteurs sont reliés entre eux. Les DLL sont au format COFF, également utilisé dans IBM AIX.

## Dans Windows

Les DLL sont une des fondations des systèmes d'exploitation Windows. Les fonctions internes de Windows sont mises à disposition des programmes par des interfaces de programmation mises en œuvre par des fichiers DLL. Les trois principales bibliothèques sont User32.dll (manipulation de l'interface utilisateur), GDI32.dll (manipulation des dispositifs d'impression et d'affichage), et Kernel32.dll (utilisation des fonctions du noyau de Windows concernant les fichiers et les processus). D'autres fichiers de Windows souvent utilisés en programmation sont comdlg32.dll, MAPI32.dll, netapi32.dll et winmm.dll. Les fichiers DLL sont également utilisés pour de nombreuses extensions : pilotes, boîtes de dialogue, widgets, polices de caractères.
Windows offre la possibilité de détourner ou de subtiliser les fonctions des DLL. Outre des raisons légitimes, ces possibilités sont exploitées par des rootkit, qui injectent des fonctionnalités à l'insu de l'utilisateur en subtilisant les DLL du système d'exploitation.

## Programmation

Des langages comme C, C++ ou Delphi sont aptes à créer des DLL qui peuvent être exploitées par des programmes. De nombreux outils de développement qui proposent des bibliothèques d'exécution à l'instar des Microsoft Foundation Class Library (MFC) ou de la Visual Component Library (VCL) de Borland proposent soit une liaison statique (intégration directe du code dans l'exécutable) soit une liaison dynamique (la bibliothèque est alors à distribuer sous forme de DLL).
L'utilisation de DLL permet de mettre à disposition du code et de rendre modulaire l'architecture d'une application. La mise à jour de celle-ci peut également se faire en remplaçant uniquement les DLL obsolètes. Néanmoins, l'utilisation de plusieurs versions concurrentes de DLL est problématique sous Windows et conduit à certaines incompatibilités regroupées sous le terme DLL Hell.

## DLL hell (l'enfer des DLL)

La construction des DLL permet de facilement les remplacer pour y ajouter des nouvelles fonctions et améliorer les fonctions existantes. Il arrive cependant que le remplacement entraîne des modifications en profondeur des fonctions existantes, ce qui entraîne des pannes et un fonctionnement erroné des programmes qui l'utilisent. De plus, les DLL réalisées avec un compilateur tendent à être incompatibles avec les exécutables réalisés avec un autre compilateur.
C'est une cause connue d'appels aux services techniques qui ont baptisé ce phénomène DLL hell, « l'enfer des DLL » en anglais.
Lorsqu'un fichier DLL manque sur l'ordinateur de l'utilisateur, le lancement d'un programme qui s'en sert provoquera un message DLL Not found (« DLL non trouvée ») qui n'est d'aucune utilité pour l'utilisateur. Si la DLL existe mais n'est pas valable pour le programme, alors celui-ci n'a aucun moyen de le vérifier, ce qui peut entraîner des messages DynaLink error voire un crash du programme. Une des causes de tels incidents est que Windows n'offre pas de mécanisme interne de contrôle de version — mécanisme qui garantit qu'un programme sera associé avec la bibliothèque pour laquelle il a été construit.
Un des moyens qu'ont les programmeurs de lutter contre le DLL hell est de charger explicitement le fichier DLL : au lieu que le fichier soit automatiquement chargé au lancement du programme qui l'utilise, le programme utilise la fonction LoadLibrary, qui charge le fichier s'il existe. La principale différence entre cette méthode et la méthode classique est que l'exécutable ne connait pas à l'avance les adresses des fonctions dont il aura besoin.
Un autre moyen est de copier tout ou une partie du code source de la DLL dans celui du futur exécutable afin de se passer de la dite DLL. Cela peut, cependant, être illégal (souvent à cause d'une incompatibilité des licences) ou techniquement impossible (généralement parce que le code source de la DLL n'est pas disponible) mais, même quand c'est à la fois possible et légal, cela reste généralement exclu en raison d'usages.

## DLL hijacking

À cause d'une vulnérabilité appelée « DLL hijacking », « DLL spoofing », « DLL preloading », « DLL side-loading » ou « binary planting », plusieurs programmes chargent et exécutent des DLL malicieuses qui se trouvent dans les mêmes dossiers que des fichiers ouverts par ces programmes$^,$$^,$$^,$. Les programmes exécutés à partir de dossiers non protégés, tels que « Téléchargements » et « Tmp » qui sont en lecture/écriture, sont plus susceptibles d'être visés$^,$$^,$$^,$$^,$$^,$$^,$.
Cette vulnérabilité aurait été découverte en 2000 pour la première fois. En août 2010, après qu'elle soit redécouverte, plusieurs médias de différents pays en discutent. Plusieurs centaines de programmes sont alors jugés vulnérables. En avril 2022, il est révélé que VLC media player aurait fait l'objet d'une telle attaque pendant une quinzaine d'années.