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