Я пытаюсь понять, что происходит, когда модули с глобальными и статическими переменными динамически связаны с приложением. По модулю я имею в виду каждый проект в решении (я много работаю с визуальной студией!). Эти модули либо встроены в *.lib, либо *.dll, либо сами *.exe.
Я понимаю, что двоичный файл приложения содержит глобальные и статические данные всех отдельных единиц перевода (объектных файлов) в сегменте данных (и только сегмент чтения только если const).
-
Что происходит, когда это приложение использует модуль A с динамической связью времени загрузки? Я предполагаю, что в DLL есть раздел для его глобальных и статических данных. Загружает ли операционная система? Если да, то где они загружаются в?
-
И что происходит, когда приложение использует модуль B с динамической привязкой во время выполнения?
-
Если у меня есть два модуля в моем приложении, которые используют A и B, являются копиями A и B-глобалов, созданных, как указано ниже (если это разные процессы)?
-
У DLLs A и B доступ к глобальным приложениям приложений?
(Просьба также указать ваши причины)
Цитата из MSDN:
Переменные, объявленные как глобальные в файле исходного кода DLL, рассматриваются как глобальные переменные компилятором и компоновщиком, но каждый процесс, который загружает данную DLL, получает свою собственную копию этих глобальных переменных DLL. Область статических переменных ограничена блоком, в котором объявлены статические переменные. В результате каждый процесс имеет свой собственный экземпляр глобальных и статических переменных DLL по умолчанию.
и здесь:
При динамическом связывании модулей может быть непонятно, есть ли в разных библиотеках свои собственные экземпляры глобальных переменных или общие глобальные таблицы.
Спасибо.