2014-02-27 6 views
6

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 fun1x.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)?

Antwort

6

Prozesse erhalten ihre privaten Kopien von y und es wird durch eine neue Kopie ersetzt, wenn Sie exec anrufen. Es befindet sich im Datensegment der Bibliothek.

+0

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

+0

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. –

+0

@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

2

Jeder Prozess erstellt seine eigene Instanz der Variablen y beim Laden der Bibliothek beim Start vor dem Erreichen main Einstiegspunkt.