Vamos pensar sobre isso com muito cuidado. O libA.so está estaticamente vinculado ao STL. No entanto, o STL não existe isoladamente, requer o tempo de execução C (CRT). Ambos residem na libstdc ++. Uma biblioteca estática. Isso significa que libA.so e libB.so possuem estruturas de dados CRT separadas. Em particular, o heap usado pelo libA.so é diferente do heap usado pelo libB.so. Alocar uma string do heap de tempo de execução da libA e tentar liberar o tempo de execução da libB simplesmente não funcionará porque o tempo de execução da libB não possui registros de alocação da string. A única maneira de destruir corretamente a string é chamando o destruidor no libA.so.
Alguém pode perguntar: mas libB.so recebe uma cópia da string, certo? Sim, está certo, mas quem alocou esta cópia? Ele foi alocado usando o construtor de cópia no contexto do tempo de execução da libA.
Dito isto, você ainda pode usar a sequência de libB.so. Você simplesmente não pode destruí-lo a partir daí.
Você também pode permitir que a libB receba um ponteiro para a string e, em seguida, crie uma cópia dela dentro do contexto do tempo de execução da libB. Essa cópia pode ser destruída pelo libB.
E é por isso que a vinculação estática às vezes é ruim.