Что происходит с глобальными переменными в разделяемой библиотеке, когда к ней вызывается dlclose? - PullRequest
4 голосов
/ 19 января 2011

Если совместно используемая библиотека (или DLL) используется посредством механизма dlopen и dlclose и если созданная разделяемая библиотека имеет некоторые глобальные переменные, память которых поступает из кучи, то что произойдет с этими переменными и памятью, когда dlclose будетназывается?

Если в том же процессе снова вызывается dlopen, каково будет поведение?

1 Ответ

8 голосов
/ 19 января 2011

Если dlclose уменьшает счетчик ссылок до нуля, а библиотека фактически выгружена, любая дальнейшая перезагрузка библиотеки должна сбросить все переменные со статической продолжительностью хранения в библиотеке до их исходных значений.

Однако,если библиотека была открыта более одного раза, все, кроме последнего вызова dlclose, просто уменьшат счетчик ссылок.Иногда может быть неочевидным, была ли библиотека открыта более одного раза, поскольку она могла быть загружена как зависимость какой-либо другой библиотеки без вашего ведома, если только это не модуль, локальный для вашей программы, поэтому, вероятно, не стоит полагаться на неек этому поведению «сброса».

Занятый русский добавил:

Даже если библиотека dlopen() ed и dlclose() d ровно один раз, и не зависит от чего-либоиначе, ссылка на символы из него (через dlsym()) также увеличивает счетчик ссылок (и делает библиотеку не выгружаемой);по крайней мере, в Linux.

Я понятия не имею, является ли эта информация точной или нет.В будущем, пожалуйста, публикуйте новую информацию в виде комментария или нового ответа, а не для редактирования ответов других людей.Если вы просто редактируете чужие ответы, вы заставляете их брать на себя ответственность за правильность вашего ответа, чего они могут не хотеть.

...