Falha no dlclose: Uma Interação Esquisita entre Bibliotecas Rust e C++

2025-08-30

Este post relata uma história de depuração desconcertante: ao usar `dlclose` para descarregar uma biblioteca dinâmica, a libA foi descarregada com sucesso, mas sua dependência, libB, inesperadamente permaneceu na memória. A investigação revelou que a causa raiz era destrutores de armazenamento local de thread (TLS) registrados na libB. Como as threads não saíram, esses destrutores não foram executados, impedindo que a libB fosse descarregada. A ativação do registro resolveu o problema porque a biblioteca de registro também usava TLS, impedindo que a libA fosse descarregada e, assim, mantendo o estado compartilhado consistente entre a libA e a libB. Este caso destaca a importância de entender o comportamento de `dlclose` e o impacto dos destrutores TLS, recomendando o uso da variável de ambiente `LD_DEBUG` para depurar bibliotecas de link dinâmico.

Desenvolvimento linkagem dinâmica