Angenommen, ich habe eine Bibliothek mit dieser Funktion gemeinsam genutzt, wobei "i" eine globale Variable ist.Wie sind globale Variablen in gemeinsam genutzten Bibliotheken verknüpft?
int foo() {
return i++;
}
Wenn ich diese Funktion von mehreren Prozessen aus aufrufen, ist der Wert von "i" in jedem Prozess unabhängig von den anderen Prozessen.
Dieses Verhalten ist durchaus zu erwarten.
Ich frage mich nur, wie wird normalerweise dieses Verhalten vom Linker implementiert? Aus meiner Sicht wird der Code zwischen Prozessen geteilt, so dass die Variable in allen Adressräumen jedes Programms, das diese Bibliothek verwendet, dieselbe virtuelle Adresse haben muss. Dieser Zustand scheint mir ziemlich schwierig zu sein, daher denke ich, dass mir hier etwas fehlt und es anders gemacht wird.
Kann ich nähere Informationen zu diesem Thema erhalten?
** Code ** ist freigegeben, nicht ** Daten. ** Der dynamische Linker erstellt vermutlich eine neue Kopie der Variablen für jeden Prozess, erstellt jedoch keine Kopien des Textsegments (Code). –
@ H2CO3 Ich bin mir dessen bewusst. Ich frage jedoch nach den Einzelheiten des Verknüpfungsprozesses. –
Nun, wenn Sie mehr Details benötigen, sollten Sie sich eine tatsächliche Implementierung ansehen. Der dynamische Linker in Linux und der in Darwin (BSD/OS X/iOS) sind Opensource. –