Je sais qu'un .so
fichier est une sorte de bibliothèque dynamique (de nombreux threads peuvent partager de telles bibliothèques, il n'est donc pas nécessaire d'en avoir plus d'une copie en mémoire). Mais quelle est la différence entre .a
et .la
? S'agit-il uniquement de bibliothèques statiques?
Si les bibliothèques dynamiques ont de gros avantages par rapport aux bibliothèques statiques, pourquoi y a-t-il encore beaucoup de bibliothèques statiques?
Je veux également connaître le mécanisme sous-jacent pour charger les bibliothèques (les deux types) et comment un morceau de code dans une bibliothèque est invoqué lorsqu'il est utilisé quelque part. Quelle partie du noyau dois-je étudier? Et quelle commande / utilitaire Linux connexe dois-je connaître pour savoir comment un processus s'exécute? (Je ne connais que la ld
commande maintenant)
Quand dois-je essayer de construire du code dans .so
ou .a
? Quel est le meilleur?
[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep 2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror 931 Sep 2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep 2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep 2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror 932 Sep 2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep 2 23:25 openvpn-plugin-down-root.so
Réponses:
.so
les fichiers sont des bibliothèques dynamiques . Le suffixe signifie "objet partagé", car toutes les applications liées à la bibliothèque utilisent le même fichier, plutôt que de faire une copie dans l'exécutable résultant..a
les fichiers sont des bibliothèques statiques . Le suffixe signifie "archive", car il ne s'agit en fait que d'une archive (créée avec laar
commande - un prédécesseurtar
qui est maintenant utilisé pour créer des bibliothèques) des fichiers objet .o d'origine..la
Les fichiers sont des fichiers texte utilisés par le paquet GNU "libtools" pour décrire les fichiers qui composent la bibliothèque correspondante. Vous pouvez trouver plus d'informations à leur sujet dans cette question: à quoi sert le fichier .la de libtool?Les bibliothèques statiques et dynamiques ont chacune des avantages et des inconvénients.
Static pro: L'utilisateur utilise toujours la version de la bibliothèque que vous avez testée avec votre application, il ne devrait donc pas y avoir de problèmes de compatibilité surprenants.
Con statique: si un problème est résolu dans une bibliothèque, vous devez redistribuer votre application pour en profiter. Cependant, à moins qu'il s'agisse d'une bibliothèque que les utilisateurs sont susceptibles de mettre à jour eux-mêmes, vous devrez peut-être le faire de toute façon.
Dynamic pro: l'empreinte mémoire de votre processus est plus petite, car la mémoire utilisée pour la bibliothèque est amortie parmi tous les processus utilisant la bibliothèque.
Dynamic pro: les bibliothèques peuvent être chargées à la demande au moment de l'exécution; c'est bon pour les plugins, vous n'avez donc pas à choisir les plugins à utiliser lors de la compilation et de l'installation du logiciel. De nouveaux plugins peuvent être ajoutés à la volée.
Con dynamique: la bibliothèque peut ne pas exister sur le système sur lequel quelqu'un essaie d'installer l'application, ou il se peut qu'elle ait une version qui n'est pas compatible avec l'application. Pour atténuer ce problème, le package d'application peut avoir besoin d'inclure une copie de la bibliothèque, afin de pouvoir l'installer si nécessaire. Cela est également souvent atténué par les gestionnaires de packages, qui peuvent télécharger et installer les dépendances nécessaires.
Les bibliothèques dynamiques sont particulièrement utiles pour les bibliothèques système, comme
libc
. Ces bibliothèques doivent souvent inclure du code qui dépend du système d'exploitation et de la version spécifiques, car les interfaces du noyau ont changé. Si vous liez un programme à une bibliothèque système statique, il ne s'exécutera que sur la version du système d'exploitation pour laquelle cette version de bibliothèque a été écrite. Mais si vous utilisez une bibliothèque dynamique, elle récupérera automatiquement la bibliothèque installée sur le système sur lequel vous exécutez.la source