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.so
et libsome2.so
.
- Une application est liée contre libsome1.so
.
- Cette application utilise libdl.so
pour charger dynamiquement un autre module, par exemple libmagic.so
.
- Maintenant libmagic.so
est 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.so
sont 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.so
avec un script de l'éditeur de liens qui cache tous les symboles sauf 3 qui sont définis libmagic.so
et exportés par celui-ci. Cela fonctionne ... Ou au moins libVersion()
et les LIB_VERSION
valeurs 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.so
et 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.so
un 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.so
répertorie toujours les symboles comme symbol
et non symbol@@VER_2
) ... Rien ne semble fonctionner !!! Aidez-moi!!!!!!
RTLD_LOCAL
et RTLD_DEEPBIND
dlopen dans votre application. Je n'ai pas le temps de tester cela maintenant, mais cela devrait fonctionner en fonction de la page de manuel.