Компиляция
Когда файл компилируется, переменные с «продолжительностью программы» (статические или глобальные переменные), которые определены в этой «единице компиляции» (в грубом выражении, «файл c»), определяют, каксколько глобального пространства нужно этой программе, и как она инициализируется.
Ссылка
Когда компоновщик создает ваш исполняемый файл, он объединяет эту информацию и помещает ее в разделы исполняемого файла, используемые для этой цели.Затем компоновщик просматривает и изменяет все ссылки на эти данные, чтобы поместить их в область памяти процесса при загрузке программы.Таким образом, указатели на глобальные данные будут похожи на константы в вашем исходном файле;для них не нужно выделять память.
Для глобальных данных с нулевой инициализацией или неинициализированным хранится только объем пространства, необходимого для таких данных.Для инициализированных данных сохраняются начальные значения.
Load
Когда ваша программа загружена, загрузчик изучит файл программы, чтобы узнать, сколько нужно инициализированных нулем данных, и установитвыделив для этого достаточно места в памяти процесса, и инициализируем все это двоичным нулем.Для инициализированных данных он выделяет для этого память и инициализирует их начальными значениями, сохраненными в exe-файле.Он также выделяет области для кучи (используемой malloc ()) и стека.
Динамические библиотеки
Если ваш код находится в динамической библиотеке, компоновщик не может знать, где онпоставит глобальные данные.В этом случае он создает разделы в библиотеке, чтобы сообщить ей, где находятся ссылки на глобальные данные, а загрузчик позаботится об изменении ссылок, чтобы они указывали на правильное место, когда он загружает файл (этоВот почему вы передаете -fPIC в командной строке gcc для dll).Но так как это делается во время загрузки, к тому времени, когда ваша программа запускает, размещение данных уже известно, поэтому загрузчик знает, где эти данные будут указателями на глобальные данные, все еще может действовать как константа в вашей программе.
Динамическая загрузка
Если вы динамически ссылаетесь на dll, загрузчик об этом не знает, поэтому вам нужно вызывать функции, которые знают, как загрузить dll и получить адрес ее экспортированных данных и функций.