Pages : 1
#1 Le 04/11/2015, à 22:33
- kinju
[Résolu] dlopen et dlclose
Bonjour,
J'ai un service codé en C++ qui charge une bibliothèque dynamique via dlopen en début d'utilisation et dlclose dlclose en fin d'utilisation.
Mon soucis vient du fait que je pense que le dlclose garde en cache la bibliothèque utilisée, ou le système je ne sais pas.
En effet, j'ai une fonction qui fait un void* hr = dlopen("malib.so") et dans la foulée un dlclose(hr) donc logiquement il n'y a plus de lien logique entre les deux, la bibliothèque devrait être détruite en mémoire.
Mais je peux supprimer le fichier "malib.so", les prochains appels à dlopen fonctionnent toujours alors que la bibliothèque utilisée n'existe plus sur le FS, c'est pas normal ça.
Si je coupe l'exécutable et le redémarre j'ai une erreur légitime "malib.so does not exists", ce que me laisse penser à une histoire de cache conservé par l'exécutant ou le system, mais comment le "vider" sans avoir à couper le service et le redémarrer ?
Le mode opératoire est celui qu'un exécutable gère des plugin sans avoir besoin de se recharger lui pour les prendre en compte eux.
Merci pour vos lumières :)
A bientô
Dernière modification par kinju (Le 05/11/2015, à 14:02)
Hors ligne
#2 Le 05/11/2015, à 01:01
- mrlem
Re : [Résolu] dlopen et dlclose
Tu ne passes aucun flag au dlopen ?
Hors ligne
#3 Le 05/11/2015, à 09:42
- kinju
Re : [Résolu] dlopen et dlclose
Si, je passe RTLD_LAZY
Hors ligne
#4 Le 05/11/2015, à 10:00
- mrlem
Re : [Résolu] dlopen et dlclose
Si j'en crois ce post, les symboles flaggués STB_GNU_UNIQUE ne sont pas déchargés au dlclose(), est-ce le cas pour ta lib ? tu peux exécuter :
readelf -Ws malib.so
... et regarder si des symboles ont "UNIQUE" ? Si c'est le cas cela expliquerait le comportement observé, puisque d'après cette personne, cela fait que la glibc marque la lib comme non-déchargable. Peut-être essayer la solution qu'il suggère au link ?
--no-gnu-unique
Hors ligne
#5 Le 05/11/2015, à 10:37
- kinju
Re : [Résolu] dlopen et dlclose
Merci pour ta réponse,
Effectivement il y a des symboles "UNIQUE", ces symboles sont tous des boost::*.
J'ai essayé l'option --no-gnu-unique, la commande de lien est alors :
malib: $(SRC:.cpp=.o)
g++ -shared -rdynamic $^ ../tools/utils.a -l boost_chrono --no-gnu-unique -o malib.so
Mais les symboles boost sont toujours "UNIQUE"
Edit : Les symboles UNIQUE sont comme ceci :
2268: 000000000008464e 3 OBJECT UNIQUE DEFAULT 13 _ZN5boost9date_time16date_input_facetINS_9gregorian4dateEcSt19istreambuf_iteratorIcSt11char_traitsIcEEE22four_digit_year_formatE
Dernière modification par kinju (Le 05/11/2015, à 10:39)
Hors ligne
#6 Le 05/11/2015, à 11:47
- kinju
Re : [Résolu] dlopen et dlclose
Ha c'est bon
J'ai mis le --no-gnu-unique en phase de compilation et non en phase de link.
Ça fonctionne, les symboles UNIQUE sont devenus GLOBAL
Merci beaucoup !
Hors ligne
#7 Le 05/11/2015, à 13:35
- mrlem
Re : [Résolu] dlopen et dlclose
Cool ! Merci pour le retour.
N'oublie pas de préfixer ton sujet avec "[Résolu] " !
Hors ligne
Pages : 1