Quelle est la différence entre les fichiers de bibliothèque .so, .la et .a?

230

Je sais qu'un .sofichier 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 .aet .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 ldcommande maintenant)

Quand dois-je essayer de construire du code dans .soou .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
hugemeow
la source
Voir également autotools.io/libtool/lafiles.html
Pacerier

Réponses:

306

.soles 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.

.ales fichiers sont des bibliothèques statiques . Le suffixe signifie "archive", car il ne s'agit en fait que d'une archive (créée avec la arcommande - un prédécesseur tarqui est maintenant utilisé pour créer des bibliothèques) des fichiers objet .o d'origine.

.laLes 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.

Barmar
la source
1
@Barmar, vous dites donc que les avantages des bibliothèques statiques l'emportent sur les avantages des bibliothèques dynamiques?
Pacerier
4
@Pacerier Je ne sais pas d'où tu viens.
Barmar
13
C'est une question vide de sens. Le poids du pour et du contre dépend des circonstances, il n'y a pas de réponse universelle. Il semble que vous ayez un ordre du jour et que vous essayez de m'appâter.
Barmar
3
@Barmar, Nop, je suis innocent. Juste un curieux.
Pacerier
11
Un autre facteur est l'octroi de licences - LGPL nécessite une liaison dynamique dans un contexte commercial, c'est-à-dire lorsque vous ne souhaitez pas distribuer votre source.
Sam