В моем следующем сценарии:
хотя обе библиотеки связывают один и тот же libCommon.so, они устанавливают разные конфигурации libCommon.so
--> libA.so --> libCommon.so
/
ProgramA
\
--> libB.so --> libCommon.so--> libA.so
/ \
ProgramA --> libCommon.so
\ /
--> libB.so
Будет ли моя программа использовать одну и ту же копию libCommon.so или использовать другую копию? Как я упоминал ранее, libCommon.so используются с разными настройками. В идеале я хочу, чтобы это было похоже на первую диаграмму, чтобы в libCommon.so были разные копии в памяти. Я пытаюсь избежать звонка, чтобы одна копия влияла на поведение другой стороны.
Краткий ответ: вы получаете вторую диаграмму. И это обычно то, что хотят большинство разработчиков, иначе было бы меньше преимуществ для динамического связывания. Это действительно зависит от реализации libCommon, позволяющей создавать несколько экземпляров в одном и том же процессе — обычно это достигается за счет исключения глобальных переменных в библиотеках для поддержания состояния между вызовами экспортируемых функций.
Поддерживаете ли вы источник для libCommon? Если это так, то найдите способы исправить его, чтобы его использование основывалось на «сессиях», а не на поддержании всех состояний в глобальных переменных.
Если нет, то поддерживаете ли вы исходный код для libA или libB? По сути, вы можете получить первую диаграмму, если статически скомпоновать одну или обе библиотеки libA и libB с libCommon.a вместо libCommon.so, что предполагает наличие статически скомпилированной версии libCommon.a.
Других решений пока нет …