J'essaie d'en savoir plus sur le versionnage des bibliothèques sous Linux et comment mettre tout cela en œuvre. Voici le contexte:
- J'ai deux versions d'une bibliothèque dynamique qui exposent le même ensemble d'interfaces, disons libsome1.soet libsome2.so.
- Une application est liée contre libsome1.so.
- Cette application utilise libdl.sopour charger dynamiquement un autre module, par exemple libmagic.so.
- Maintenant libmagic.soest lié contre libsome2.so. De toute évidence, sans utiliser de scripts de l'éditeur de liens pour masquer les symboles libmagic.so, au moment de l'exécution, tous les appels aux interfaces libsome2.sosont résolus libsome1.so. Cela peut être confirmé en vérifiant la valeur retournée par libVersion()la valeur de la macro LIB_VERSION.
- J'essaie donc ensuite de compiler et de lier libmagic.soavec un script de l'éditeur de liens qui cache tous les symboles sauf 3 qui sont définis libmagic.soet exportés par celui-ci. Cela fonctionne ... Ou au moins libVersion()et les LIB_VERSIONvaleurs correspondent (et il rapporte la version 2 et non 1).
- Cependant, lorsque certaines structures de données sont sérialisées sur disque, j'ai remarqué une corruption. Dans le répertoire de l'application, si je supprime libsome1.soet crée un lien logiciel à sa place libsome2.so, tout fonctionne comme prévu et la même corruption ne se produit pas.
Je ne peux pas m'empêcher de penser que cela peut être dû à un conflit dans la résolution des symboles de l'éditeur de liens. J'ai essayé beaucoup de choses, comme essayer de créer libsome2.soun lien pour que tous les symboles soient alignés symbol@@VER_2(ce qui me laisse encore perplexe parce que la commande nm -CD libsome2.sorépertorie toujours les symboles comme symbolet non symbol@@VER_2) ... Rien ne semble fonctionner !!! Aidez-moi!!!!!!
RTLD_LOCALet RTLD_DEEPBINDdlopen dans votre application. Je n'ai pas le temps de tester cela maintenant, mais cela devrait fonctionner en fonction de la page de manuel.