dlclose-Fehler: Ein seltsames Zusammenspiel zwischen Rust- und C++-Bibliotheken
Dieser Beitrag beschreibt eine verwirrende Debugging-Geschichte: Beim Entladen einer dynamischen Bibliothek mit `dlclose` wurde die Bibliothek libA erfolgreich entladen, aber ihre Abhängigkeit libB blieb unerwartet im Speicher. Die Untersuchung ergab, dass die Ursache in Thread Local Storage (TLS)-Destruktoren lag, die in libB registriert waren. Da die Threads nicht beendet wurden, wurden diese Destruktoren nicht ausgeführt, was das Entladen von libB verhinderte. Das Aktivieren der Protokollierung löste das Problem, da die Protokollierungsbibliothek auch TLS verwendete, wodurch das Entladen von libA verhindert wurde und so ein konsistenter gemeinsamer Zustand zwischen libA und libB erhalten blieb. Dieser Fall unterstreicht die Bedeutung des Verständnisses des Verhaltens von `dlclose` und der Auswirkungen von TLS-Destruktoren und empfiehlt die Verwendung der Umgebungsvariablen `LD_DEBUG` zum Debuggen dynamischer Bibliotheken.