dlcloseの失敗:RustとC++ライブラリの奇妙な相互作用
2025-08-30
この記事では、不可解なデバッグの話を紹介します。動的ライブラリを`dlclose`でアンロードする際に、libAは正常にアンロードされましたが、その依存ライブラリであるlibBは予期せずメモリに残りました。調査の結果、根本原因はlibBに登録されたスレッドローカルストレージ(TLS)のデストラクタであることが判明しました。スレッドが終了しなかったため、これらのデストラクタは実行されず、libBのアンロードが妨げられました。ロギングを有効にすると問題が解決しましたが、これはロギングライブラリもTLSを使用していたため、libAもアンロードされず、libAとlibBの共有状態の一貫性が維持されたためです。このケースは、`dlclose`の動作とTLSデストラクタの影響を理解することの重要性を強調しており、動的ライブラリのデバッグには`LD_DEBUG`環境変数の使用を推奨しています。
開発
動的リンク