Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/11/2015, à 23: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, à 15:02)

Hors ligne

#2 Le 05/11/2015, à 02:01

mrlem

Re : [Résolu] dlopen et dlclose

Tu ne passes aucun flag au dlopen ?

Hors ligne

#3 Le 05/11/2015, à 10:42

kinju

Re : [Résolu] dlopen et dlclose

Si, je passe RTLD_LAZY

Hors ligne

#4 Le 05/11/2015, à 11: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, à 11: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" sad

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, à 11:39)

Hors ligne

#6 Le 05/11/2015, à 12:47

kinju

Re : [Résolu] dlopen et dlclose

Ha c'est bon smile

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, à 14: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