Question

Sur 'C', Linux,

Ai-je besoin de bibliothèques statiques pour lier statiquement ou de bibliothèques partagées suffisantes? Si non pourquoi pas (Ne contiennent-ils pas les mêmes données?)

Était-ce utile?

La solution

Oui, vous avez besoin de bibliothèques statiques pour créer un exécutable lié statiquement.

Les bibliothèques statiques sont des ensembles d’objets compilés. Lorsque vous établissez un lien statique avec une bibliothèque, cela revient en fait à prendre les résultats de la compilation de cette bibliothèque, à les décompresser dans votre projet actuel et à les utiliser comme s'il s'agissait de vos propres objets.

Les bibliothèques dynamiques sont déjà liées. Cela signifie que certaines informations, telles que les relocalisations, ont déjà été corrigées et rejetées.

De plus, les bibliothèques dynamiques doivent être compilées en tant que code indépendant de la position. Il ne s'agit pas d'une restriction sur les bibliothèques statiques et entraîne une différence de performances significative sur certaines plates-formes courantes (telles que x86).

Il existe des outils tels que Statifier ELF qui tentent de regrouper des bibliothèques liées dynamiquement dans un exécutable lié dynamiquement, mais il est très difficile de générer un résultat qui fonctionne correctement dans toutes les circonstances.

Autres conseils

Il n’existe pas de compilation statique, seulement des liens statiques. Et pour cela, vous avez besoin de bibliothèques statiques. La différence entre les liens statiques et dynamiques réside dans le fait que, dans le premier cas, les noms sont résolus au moment de la liaison (juste après la compilation), alors qu’ils sont résolus au moment où le programme commence.

Les bibliothèques statiques et dynamiques peuvent ou non contenir les mêmes informations, en fonction de nombreux facteurs. La décision de lier statiquement ou dynamiquement votre code est une décision importante qui influencera souvent l’architecture des applications.

Toutes les bibliothèques que vous associez à un programme lié de manière statique doivent être la variante statique. Alors que les bibliothèques dynamiques (libfoo.so) et statiques (libfoo.a) ont les mêmes fonctions, ce sont des fichiers de format différent. Vous avez donc besoin du type correspondant à votre programme.

Une autre option est Ermine ( http://magicErmine.com ) C'est comme un statifiant, mais capable de gérer la randomisation de la mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top