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 des Hauptprogramms der statischen Variablen und zerstört sie, was zu einem Segmentfehler führt, wenn das Hauptprogramm versucht, es zu zerstören.Hauptprogramm und gemeinsam genutzte Bibliothek initialisiert dieselbe statische Variable in __static_initialization_and_destruction_0

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

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 Symbolreduzierung unter Verwendung der version command 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.

+0

Hrm, ich habe ein Problem mit der Implementierung des Versions-Skripts und der Übergabe an den Linker. Es beschwert sich über einen Syntaxfehler. Hier ist die Skriptdatei, die ich verwendet habe: "{global: local: *;}" Irgendwelche Ideen? Ich habe nach Beispielen gesucht, aber alle scheinen die Syntaxprüfung nicht zu bestehen. Oder ist es besser, die Anweisung __asm__ direkt in die Quelle zu schreiben? – Paul

+0

@Paul - meine Skripts sehen wie folgt aus: VERSION {{global: ...; lokal *; }; } 'und dann benutze ich einfach den Dateinamen dieser Datei in der Linker-Befehlszeile. –

+0

@Samuel - Vielen Dank, nachdem das Versions-Skript fertiggestellt wurde und ein paar Symbole zum globalen Kontext hinzugefügt wurden, funktioniert es jetzt! – Paul

Verwandte Themen