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