Załóżmy, że mam wspólną bibliotekę z tą funkcją, gdzie "i" jest jakąś zmienną globalną.W jaki sposób powiązane są zmienne globalne w bibliotekach wspólnych?
int foo() {
return i++;
}
Kiedy wywołać tę funkcję od wielu procesach wartość „i” w każdym procesie jest niezależny od innych procesów.
To zachowanie jest dość spodziewane.
Zastanawiam się, jak zwykle to zachowanie jest realizowane przez linker? Z mojego rozumienia kod jest dzielony między procesy, więc zmienna musi mieć ten sam adres wirtualny we wszystkich przestrzeniach adresowych każdego programu, który używa tej biblioteki. Ten stan wydaje się dość trudny do osiągnięcia, więc myślę, że tu coś pomijam i robi się to inaczej.
Czy mogę uzyskać bardziej szczegółowe informacje na ten temat?
** Kod ** jest udostępniony, a nie ** dane. ** Dynamiczny linker prawdopodobnie tworzy nową kopię zmiennej dla każdego procesu, ale nie tworzy kopii segmentu tekstowego (kodu). –
@ H2CO3 Jestem tego świadomy. Jednak pytam o szczegóły procesu łączenia. –
Cóż, jeśli potrzebujesz więcej szczegółów, myślę, że powinieneś rzucić okiem na rzeczywistą implementację. Dynamiczny linker w Linuksie i ten w Darwin (BSD/OS X/iOS) to opensource. –