7
votes

Liaison contre plusieurs bibliothèques partagées que toutes liées à une bibliothèque statique commune

Dites que vous avez 2 bibliothèques partagées, lib1.so et lib2.so, que les deux ont la libercommon.a les liées statilement. Le compilateur pourrait-il se plaindre de références de symboles ambiguës si vous deviez relier dynamiquement la lib1.so et la lib2.so? Ou serait le compilateur suffisamment intelligent pour connaître les symboles LibCommon sont partagés entre la lib1 et la lib2 et vous permettre de lier de manière dynamique contre les deux?


0 commentaires

3 Réponses :


2
votes

La bibliothèque statique serait utilisée pour résoudre les liens en interne, mais la liaison externe ne serait pas propagée à l'interface de la bibliothèque partagée. Il n'y aurait donc aucun conflit. Chaque bibliothèque partagée inclurait sa propre copie du code de la bibliothèque statique.


3 commentaires

Au moins sous GNU / Linux, si je crée une bibliothèque partagée (.so) qui relie une bibliothèque statique (.a), je peux accéder à l'un quelconque des symboles tirés de la bibliothèque statique à partir d'un exécutable qui ne relie qu'aux partagés (.so) Bibliothèque, alors je suis sûr que les symboles de la bibliothèque statique sont propagés à l'interface de la bibliothèque partagée. Peut-être que les choses fonctionnent différemment sur certains autres systèmes, mais la plupart des systèmes que j'ai travaillé sont le cas des options de liaison par défaut.


@Jay Walker: Pour ce que ça vaut, j'ai préféré votre réponse. Quels que soient les mécanismes, la vérité fondamentale est qu'aucun conflit ne se produira.


@Clifford j'ai écrasé ça. Pour beaucoup de raisons, je ne vais pas poster ma question. Je vais supprimer mon commentaire.



3
votes

Il n'y aura pas de conflit car lorsque vous liez des bibliothèques partagées, la liaison utilisera la définition de la première bibliothèque partagée qui fournit le symbole et ne cherchera pas plus loin dans les autres bibliothèques partagées. Les symboles inclus dans la .A seront exportés dans les deux bibliothèques partagées mais ne seront pas en conflit.


1 commentaires

Ce n'est pas vrai. Il y a de faibles symboles exportés et fort. S'il y a une désambiguïté entre fort, il y a une erreur.



0
votes

Supposons les deux bibliothèques partagées liées aux différentes bibliothèques statiques. Mais les bibliothèques statiques contiennent toutes deux une fonction avec le même nom. Il y aurait un conflit.

Je suis sûr de cela parce que j'ai une application TCL / TK, il charge deux bibliothèques TCL (.so). Les deux bibliothèques sont statiques liées à la bibliothèque OpenSSL. mais avec une version différente. Un défaut de segmentation s'est produit lorsque j'exécute l'application TCL. Je le retrouve dans l'OpenSSL. Il y a une mise en œuvre de la fonction modifiée dans la nouvelle version.


0 commentaires