2016-09-27 1 views
0

Par exemple, puis-je ajouter une nouvelle fonction dans un fichier d'en-tête sans avoir besoin de recompiler tous les programmes utilisant cette bibliothèque?Ce qui peut être modifié dans la bibliothèque .so sans rompre la compatibilité

+0

Règle de base: l'ajout est autorisé mais le retrait ne l'est pas. – Downvoter

+0

Vers l'en-tête * seulement *? –

+1

@Downvoter est correct, mais j'ajouterais que le problème important est que chaque symbole exporté doit rester exporté et pointant exactement sur le même type de données, c'est-à-dire ne pas changer la signature de vos fonctions existantes. –

Répondre

1

Vous pouvez ajouter fonctions et objets à une bibliothèque partagée sans interrompre les programmes existants qui dépendent de cette bibliothèque. Dans certaines circonstances, vous pouvez augmenter la taille des objets (en particulier, les tableaux) dans la bibliothèque.

Vous pouvez également remplacer l'implémentation d'une fonction, à condition que la signature de la fonction ne change pas. Cela ne causera pas de problèmes avec la liaison dynamique, mais si le comportement de la nouvelle implémentation ne répond pas aux attentes des programmes existants, vous verrez un mauvais comportement du programme.

Vous pouvez supprimer des fonctions et des objets auxquels aucun programme n'est lié. Si vous êtes uniquement concerné par programmes existants alors vous pouvez cataloguer quelles fonctions et quels objets ils sont, mais sinon vous ne pouvez que baser une telle évaluation sur la visibilité des fonctions/objets dans la bibliothèque partagée - externe- les fonctions et les objets visibles ne peuvent pas être supprimés en toute sécurité.

Il peut y avoir d'autres détails spécifiques à l'implémentation d'une bibliothèque partagée qui peuvent être modifiés sans rompre la compatibilité. Notez toutefois que rien de tout cela n'a de lien direct avec les fichiers d'en-tête. Remarque: La compatibilité des bibliothèques partagées est principalement une considération d'exécution. Les fichiers d'en-tête ne sont pertinents que lors de la compilation.

0

Un autre point est que vous devez faire très attention à toutes les structures partagées. Si une fonction de votre bibliothèque accepte ou renvoie une structure ou un pointeur sur une structure et si vous apportez des modifications à cette structure (ajout, suppression ou réorganisation de membres), vous risquez d'introduire une incompatibilité.

(à proprement parler, des changements comme celui-ci ne comptent que des modifications à la signature de la fonction, comme mentionné par d'autres.)

Si vous êtes très, très prudent, vous pouvez prendre des dispositions pour ajouter de nouveaux membres à la fin de une structure, mais elle nécessite généralement une coopération explicite de la part des appelants, en utilisant des mécanismes définis à l'avance (c'est-à-dire adhérés depuis la version 0, par tout le code appelant, avant que des modifications ne soient apportées).