Ogólnie segment danych pliku wykonywalnego zawiera zainicjalizowane zmienne globalne/statyczne, a segment BSS zawiera niezainicjalizowane zmienne globalne/statyczne.
Gdy program ładujący ładuje program do pamięci, ujednolicone zmienne globalne/statyczne są automatycznie zerowane.
W języku C zmienne statyczne (zainicjowane lub nie) wewnątrz funkcji oznaczają, że zmienne mają zasięg lokalny/funkcja (czasami określane jako wewnętrzne statyczne), ale wciąż żyją w segmentach danych/BSS w zależności od tego, czy są inicjalizowane.
Niezależnie od tego, ile razy funkcja fun() zostanie wywołana, zmienne statyczne są inicjalizowane tylko jeden raz podczas ładowania programu.
Zmienne zdefiniowane jako statyczne i poza dowolnymi funkcjami nadal znajdują się w segmentach danych lub bss, ale mają tylko zasięg pliku.
Po skompilowaniu kodu istnieje lista importów i eksportów, która jest częścią każdego pliku obiektu i jest używana przez edytor linków. Twoje zmienne statyczne nie znajdą się na liście eksportu, a zatem nie będą dostępne dla innych plików obiektów.
Wykluczając słowo kluczowe static, zmienne globalne są umieszczane na liście eksportu i mogą być przywoływane przez inne moduły obiektów, a edytor połączeń będzie mógł znaleźć symbole podczas tworzenia pliku wykonywalnego.
Dla obrazkowe widzenia:
+--------- 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) |
+------------------------+
nie mogę zrozumieć, co jest list.Is eksportować stół symbol? – CrystalJake
W skrócie, część każdego .o (pliku obiektowego) jest listą eksportową (lista zewnętrznych symboli - globalne zmienne/funkcje), które są widoczne dla innych plików obiektów. Istnieje również lista importu (globalne zmienne/funkcje), które są symbolami przywoływanymi w pliku obiektów, ale zdefiniowanymi gdzie indziej. Podczas fazy łączenia kompilacji edytor połączeń wykorzystuje te listy do powiązania symboli. – ffhaddad