Why did dlclose not unload the library? (2023)
9 months ago
- #dlclose
- #dynamic-linking
- #debugging
- dlclose可能因多种条件无法卸载库,包括引用计数>1、NODELETE标志或待处理的线程本地存储(TLS)析构函数。
- 在调试场景中,libA(Rust)被卸载但libB(C++)未被卸载,原因是libB注册的TLS析构函数尚未执行。
- NODELETE标志可通过ELF二进制文件或dlopen标志设置,标记为STB_GNU_UNIQUE的符号(常见于libstdc++.so)也会触发此标志。
- 在libA中启用日志记录(env_logger)导致其注册TLS析构函数,从而阻止自身卸载,进而保持libB的状态一致。
- 使用LD_DEBUG调试动态加载器行为,但该工具不显示待处理的TLS析构函数——需在_dlclose设置断点才能查看。