Hauptprogramm und gemeinsam genutzte Bibliothek initialisiert dieselbe statische Variable in __static_initialization_and_destruction_0

8

Weiß jemand, warum eine in dlopen () initialisierte Bibliothek eine statische Variable initialisiert, die dem Hauptprogramm gehört? Sowohl das Hauptprogramm als auch die gemeinsam genutzte Bibliothek haben eine Kopie der statischen Variable, aber aus irgendeinem Grund initialisiert die gemeinsam genutzte Bibliothek die Kopie der statischen Variablen des Hauptprogramms neu und zerstört sie, was zu einem Segmentfehler führt, wenn das Hauptprogramm versucht, es zu zerstören / p>

Ist das ein Fall von schlechtem Namen Mangling in der Symboltabelle?

    
Paul 13.04.2010, 17:57
quelle

1 Antwort

7

Dies ist ein Fall, in dem der Laufzeit-Linker nur eine einzige aktive Kopie eines Symbols in einem Prozess benötigt. Wenn sowohl ein gemeinsam genutztes Objekt als auch die ausführbare Datei eine Kopie des Symbols enthalten, löst der Laufzeit-Linker alle Verweise auf eine dieser Komponenten auf.

Was Sie tun können, um dieses Problem zu lösen, ist die Verwendung der Symbolreduktion mit dem Versionsbefehl des Linkeditors beim Erstellen des gemeinsamen Objekts. Stellen Sie sicher, dass das Symbol für die statische Variable nicht global ist und Sie das gewünschte Verhalten erhalten.

    
R Samuel Klatchko 13.04.2010, 18:04
quelle