dlclose 失败:Rust 和 C++ 库的诡异交互

2025-08-30

本文讲述了一个令人费解的调试故事:在使用 `dlclose`卸载动态链接库时,库 libA 成功卸载,但其依赖库 libB 却意外地残留在内存中。深入调查发现,问题根源在于 libB 中注册的线程局部存储 (TLS) 析构函数。由于线程未退出,这些析构函数未执行,导致 libB 无法卸载。启用日志记录后,问题消失,因为日志库也使用了 TLS,导致 libA 也无法卸载,从而维持了 libA 和 libB 的共享状态一致性。这个案例强调了理解 `dlclose` 行为以及 TLS 析构函数的影响的重要性,并建议使用 `LD_DEBUG` 环境变量进行动态链接库调试。