разделяются ли глобальные библиотеки библиотеки времени выполнения между плагинами, загруженными с помощью dlopen? - PullRequest
5 голосов
/ 07 мая 2010

У меня есть программа на C ++, которая связывает во время выполнения, скажем, с mylib.so. затем та же программа использует dlopen () / dlsym () для загрузки функции из динамической библиотеки myplugin.so, которая, в свою очередь, имеет зависимости от mylib.so.

Мой вопрос: будет ли программа И функция в плагине иметь доступ к тем же глобальным переменным, которые определены в mydlib.so в той же области памяти, зарезервированной для программы, или каждой из них будут назначены разные, не связанные копии в собственном пространстве памяти? если последнее является поведением по умолчанию, возможно ли это изменить?

Заранее спасибо =)!

1 Ответ

1 голос
/ 07 мая 2010

Глобалы в основной программе, выполняющей dlopen, должны быть видны коду, который загружается динамически. Тем не менее, лучший совет, который я видел на сегодняшний день (особенно, если вы когда-нибудь захотите иметь даже смутно переносимый код), - это передавать только вызовы функций через разделитель компоновщика и не экспортировать переменные в любом направлении. Также лучше, если для загруженного кода есть API для регистрации интересных частей его API с помощью загрузчика (например, «Вот как я предоставляю SPI для рисования foobars на базе»), так как это гораздо более разумный способ делать обратные вызовы, чем просто смешивать все вместе.

[РЕДАКТИРОВАТЬ]: Другая причина для этого, если вы имитируете слабое соединение на платформе, которая не поддерживает его. Это очень похоже на другой, который я перечисляю, за исключением того, что это основная программа, которая создает SPI из API, экспортируемого динамической библиотекой, а не .so, экспортирующего его явно при запуске. Это на самом деле второе место, но вы обходитесь не тем, что хотите, а тем, что имеете (ну, если вы не готовы выполнить работу, написав какую-то библиотеку соединений).

...