Fichiers DLL et LIB - quoi et pourquoi?

214

Je sais très peu de choses sur les DLL et les LIB à part le fait qu'elles contiennent le code vital requis pour qu'un programme fonctionne correctement - les bibliothèques. Mais pourquoi les compilateurs les génèrent-ils? Ne serait-il pas plus facile d'inclure tout le code dans un seul exécutable? Et quelle est la différence entre les DLL et les LIB?

Xonara
la source

Réponses:

299

Il existe des bibliothèques statiques (LIB) et des bibliothèques dynamiques (DLL) - mais notez que les fichiers .LIB peuvent être des bibliothèques statiques (contenant des fichiers objets) ou des bibliothèques d'importation (contenant des symboles pour permettre à l'éditeur de liens de se lier à une DLL).

Les bibliothèques sont utilisées car vous pouvez avoir du code que vous souhaitez utiliser dans de nombreux programmes. Par exemple, si vous écrivez une fonction qui compte le nombre de caractères dans une chaîne, cette fonction sera utile dans de nombreux programmes. Une fois que cette fonction fonctionne correctement, vous ne voulez pas avoir à recompiler le code à chaque fois que vous l'utilisez, vous mettez donc le code exécutable pour cette fonction dans une bibliothèque, et l'éditeur de liens peut extraire et insérer le code compilé dans votre programme . Les bibliothèques statiques sont parfois appelées «archives» pour cette raison.

Les bibliothèques dynamiques vont encore plus loin. Il semble inutile d'avoir plusieurs copies des fonctions de la bibliothèque prenant de la place dans chacun des programmes. Pourquoi ne peuvent-ils pas tous partager une copie de la fonction? C'est à cela que servent les bibliothèques dynamiques. Plutôt que de construire le code de la bibliothèque dans votre programme lors de sa compilation, il peut être exécuté en le mappant dans votre programme lors de son chargement en mémoire. Plusieurs programmes exécutés en même temps et utilisant les mêmes fonctions peuvent tous partager une copie, économisant ainsi de la mémoire. En fait, vous ne pouvez charger des bibliothèques dynamiques qu'en fonction des besoins, en fonction du chemin dans votre code. Il est inutile que les routines d'impression prennent de la mémoire si vous n'imprimez pas. D'un autre côté, cela signifie que vous devez avoir une copie de la bibliothèque dynamique installée sur chaque machine sur laquelle votre programme s'exécute.

À titre d'exemple, presque tous les programmes écrits en «C» auront besoin de fonctions d'une bibliothèque appelée «bibliothèque d'exécution C», bien que peu de programmes aient besoin de toutes les fonctions. Le runtime C est disponible en versions statiques et dynamiques, vous pouvez donc déterminer quelle version votre programme utilise en fonction des besoins particuliers.

Charles E. Grant
la source
81
Il s'avère que les .LIBfichiers peuvent être des bibliothèques statiques (contenant des fichiers objets) ou des bibliothèques d'importation (contenant des symboles pour permettre à l'éditeur de liens de se lier à une DLL). Je me demande pourquoi il en est ainsi.
Lumi
2
bonne explication! Le code est partagé et les données (par défaut) ne sont pas partagées entre les applications consommant une DLL.
mox
4
@Lumi: Bon point. En termes de DLL, nous avons deux types de liens. Liaison implicite , lorsque nous avons un .libfichier fourni par le créateur de DLL avec les en-têtes appropriés; il .libs'agit simplement d'un descripteur de la DLL cible, il contient des adresses, un point d'entrée, etc. mais pas de code. Cela .libdoit être transmis à l'éditeur de liens. Le second est un lien explicite lorsque nous utilisons la DLL en la chargeant manuellement avec la LoadLibraryfonction. Dans ce type, nous n'avons pas besoin de ce .libfichier, mais nous devons faire un petit effort pour trouver les exportations de DLL, leurs adresses et appeler ces fonctions via des pointeurs.
itachi
37

Un autre aspect est la sécurité (obscurcissement). Une fois qu'un morceau de code est extrait de l'application principale et placé dans une bibliothèque de liens dynamiques "séparée", il est plus facile d'attaquer, d'analyser (rétro-concevoir) le code, car il a été isolé. Lorsque le même morceau de code est conservé dans une bibliothèque LIB, il fait partie de l'application cible compilée (liée), et il est donc plus difficile d'isoler (différencier) ce morceau de code du reste des binaires cibles.

mox
la source
L'aspect sécurité était nouveau pour moi. Le raisonnement ci-dessus est-il vrai dans le cas d'une application C # appelant une DLL C ++ native non gérée?
Martin
1
Mais la LIB est isolée aussi, non? Ainsi, un attaquant pourrait simplement analyser la LIB. Ou est-ce un scénario courant que la LIB n'est pas accessible au public?
Nick Russler
8
la LIB est également "isolée" en ce qui concerne le processus de compilation, mais une fois que l'éditeur de liens a rassemblé les parties, la LIB fait partie de l'EXE et ne peut pas être différenciée de votre propre code.
mox
17

Une raison importante pour créer une DLL / LIB plutôt que de simplement compiler le code dans un exécutable est la réutilisation et la relocalisation. L'application Java ou .NET moyenne (par exemple) utilisera très probablement plusieurs bibliothèques tierces (ou framework). Il est beaucoup plus facile et plus rapide de simplement compiler avec une bibliothèque pré-construite, plutôt que d'avoir à compiler tout le code tiers dans votre application. La compilation de votre code dans des bibliothèques encourage également les bonnes pratiques de conception, par exemple la conception de vos classes à utiliser dans différents types d'applications.

Andy White
la source
7

Une DLL est une bibliothèque de fonctions partagées entre d'autres programmes exécutables. Regardez simplement dans votre répertoire windows / system32 et vous en trouverez des dizaines. Lorsque votre programme crée une DLL, il crée également normalement un fichier lib afin que le programme application * .exe puisse résoudre les symboles déclarés dans la DLL.

Un .lib est une bibliothèque de fonctions qui sont liées statiquement à un programme - elles ne sont PAS partagées par d'autres programmes. Chaque programme lié à un fichier * .lib contient tout le code de ce fichier. Si vous avez deux programmes A.exe et B.exe qui sont liés à C.lib, alors chaque A et B contiendront tous les deux le code dans C.lib.

La façon dont vous créez des DLL et des bibliothèques dépend du compilateur que vous utilisez. Chaque compilateur le fait différemment.

Vinodhini Ramasamy
la source
4

Une autre différence réside dans les performances.

Comme la DLL est chargée au moment de l'exécution par le (s) .exe (s), les .exe (s) et la DLL fonctionnent avec le concept de mémoire partagée et donc les performances sont faibles par rapport à la liaison statique.

D'un autre côté, un .lib est un code qui est lié statiquement au moment de la compilation à chaque processus qui le demande. Par conséquent, les .exe (s) auront une seule mémoire, augmentant ainsi les performances du processus.

Girish Reddyvari
la source