web-dev-qa-db-fra.com

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

Je sais qu'un fichier .so est une sorte de bibliothèque dynamique (de nombreux threads peuvent partager de telles bibliothèques de sorte qu'il n'est 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 de bibliothèques statiques?

Si les bibliothèques dynamiques ont de gros avantages par rapport aux statiques, pourquoi y a-t-il encore beaucoup de bibliothèques statiques?

Je souhaite également connaître le mécanisme sous-jacent permettant de charger des bibliothèques (les deux types) et comment un morceau de code dans une bibliothèque est appelé lorsqu'il est utilisé quelque part. Quelle partie du noyau devrais-je étudier? Et quelle commande/utilitaire Linux connexe devrais-je connaître pour savoir comment un processus s'exécute? (Je ne connais que la commande ld maintenant)

Quand devrais-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
209
hugemeow

Les fichiers .so 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.

Les fichiers .a sont des bibliothèques statiques . Le suffixe signifie "archive", car il ne s'agit en réalité que d'une archive (créée à l'aide de la commande ar, prédécesseur de tar utilisée pour la création de bibliothèques) de l'objet .o d'origine des dossiers.

Les fichiers .la sont des fichiers texte utilisés par le package GNU "libtools" pour décrire les fichiers qui constituent le fichier correspondant. bibliothèque. Vous pouvez trouver plus d'informations à leur sujet dans cette question: A quoi servent 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.

Static con: Si un problème est résolu dans une bibliothèque, vous devez redistribuer votre application pour en tirer parti. Toutefois, à moins que ce ne soit 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'encombrement de la mémoire de votre processus est plus petit 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.

Dynamic con: il est possible que la bibliothèque n'existe pas sur le système sur lequel une personne tente d'installer l'application ou que sa version ne soit pas compatible avec l'application. Pour remédier à cela, le package d’application devra peut-être 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 paquets, qui peuvent télécharger et installer toutes 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 dépendant du système d'exploitation et de la version spécifiques, car les interfaces du noyau ont été modifiées. Si vous liez un programme à une bibliothèque système statique, celui-ci ne fonctionnera 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, celle-ci récupérera automatiquement la bibliothèque installée sur votre système.

277
Barmar