Say Bibliothek x.so
hat eine globale Variable y
, die von einer Funktion (etwa fun1
) in der Bibliothek manipuliert wird.globale Variable in einer .so Bibliothek
Wenn ein Prozess p1
geladen wird in dem RAM, dessen Code mit der Funktion aus der Bibliothek fun1
x.so
, die Bibliothek x.so in dem RAM geladen wird (wenn nicht schon vorhanden) durch ld.so und das Funktionssymbol wird, bevor die aufgelösten Programm startet die Ausführung.
Jetzt wo ist diese globale Variable erstellt. Ist es in Bearbeitung p1
?
Was passiert, wenn ein anderer Prozess p2
auch fun1
verwendet (was Operationen an y
macht)?
Wenn also ld.so sieht, dass das aktuelle Programm eine Funktion aus einer Bibliothek verwendet, erstellt es eine neue Kopie der Variablen im Datensegment der Bibliothek in das eigene Datensegment des aktuellen Prozesses? Wenn es einen Aufruf von exec() gibt, beginnt das ganze ld.so-Symbol mit dem neuen Code zu beginnen. – tez
Das Datensegment der Bibliothek wird sofort erstellt, wenn die Bibliothek geladen wird. Es wird auf ähnliche Weise wie die Globals Ihrer ausführbaren Datei erstellt (als private Kopie mit schreibgeschützter VM-Zuordnung). Im Gegensatz zu Funktionssymbolen werden Symbole zu Daten sofort aufgelöst. Wenn 'exec' aufgerufen wird, wird Ihre gesamte Prozess-VM durch eine neue ersetzt und alle Bibliotheken werden von Grund auf neu zugeordnet. –
@SergeyL, wenn Sie einen 'exec()' style-Aufruf ausführen, wird konzeptionell der gesamte Speicherbereich des Prozesses dupliziert, sodass das Kind eine neue Kopie erhält. Um es effizient zu machen, gibt das Betriebssystem ihnen in der Praxis nur Zugriff auf eine gemeinsame Nur-Lese-Kopie und dupliziert nur beim Schreiben (Kopieren-beim-Schreiben). Keine erneute Zuordnung erforderlich. – vonbrand