В целом сегмент данных исполняемого файла содержит инициализированные глобальные/статические переменные, а сегмент BSS содержит неинициализированные глобальные/статические переменные.
Когда загрузчик загружает вашу программу в память, унифицированные глобальные/статические переменные автоматически заполняются нулями.
В C статические переменные (инициализированные или нет) внутри функции означают, что переменные имеют локальную/функциональную область (иногда называемую внутренней статикой), но они все еще живут в сегментах данных/BSS в зависимости от того, они инициализируются.
Так что независимо от того, сколько раз вызывается fun(), статические переменные инициализируются только один раз при загрузке программы.
Переменные, определенные как статические и вне любых функций, все еще живут в сегментах данных или bss, но имеют только область файлов.
Когда ваш код скомпилирован, есть список импорта и экспорта, который является частью каждого объектного файла и используется редактором связей. Ваши статические переменные не будут в списке экспорта и, следовательно, недоступны для других объектных файлов.
Исключая ключевое слово static, ваши глобальные переменные помещаются в список экспорта и могут ссылаться на другие объектные модули, и редактор связей сможет находить символы при создании исполняемого файла.
Для pictoral зрения:
+--------- TEXT ---------+ Low memory
| main() |
| fun() |
+--------- DATA ---------+
| int a (global scope) |
| int c (file scope) |
| int e (function scope) |
+---------- BSS ---------+
| int b (global scope) |
| int d (file scope) |
| int f (function scope) |
+------------------------+
Я не могу понять, что является экспорт list.Is IT таблица символов? – CrystalJake
Короче говоря, часть каждого .o (object file) - это список экспорта (список внешних символов - глобальные переменные/функции), которые видны другим объектным файлам. Кроме того, есть список импорта (глобальные переменные/функции), которые являются символами, указанными в объектном файле, но определенными в другом месте. Во время этапа компоновки ссылки редактор связей использует эти списки для объединения символов вместе. – ffhaddad