dlclose 실패: Rust와 C++ 라이브러리 간의 이상한 상호 작용
2025-08-30
이 글에서는 난해한 디버깅 이야기를 설명합니다. `dlclose`를 사용하여 동적 라이브러리를 언로드할 때 libA는 정상적으로 언로드되었지만, 종속 라이브러리인 libB는 예상치 못하게 메모리에 남아 있었습니다. 조사 결과, 근본 원인은 libB에 등록된 스레드 로컬 스토리지(TLS) 디스트럭터임이 밝혀졌습니다. 스레드가 종료되지 않았기 때문에 이러한 디스트럭터는 실행되지 않았고, libB 언로드가 방해되었습니다. 로깅을 활성화하자 문제가 해결되었는데, 이는 로깅 라이브러리도 TLS를 사용했기 때문에 libA도 언로드되지 않고 libA와 libB의 공유 상태가 일관성을 유지했기 때문입니다. 이 사례는 `dlclose` 동작과 TLS 디스트럭터의 영향을 이해하는 것이 중요함을 강조하며, 동적 라이브러리 디버깅에는 `LD_DEBUG` 환경 변수를 사용할 것을 권장합니다.
개발
동적 링크