Estou tentando aprender mais sobre o controle de versão da biblioteca no Linux e como colocar tudo para funcionar. Aqui está o contexto:
- Eu tenho duas versões de uma biblioteca dinâmica que expõem o mesmo conjunto de interfaces, digamos libsome1.soe libsome2.so.
- Um aplicativo está vinculado libsome1.so.
- Este aplicativo usa libdl.sopara carregar dinamicamente outro módulo, digamos libmagic.so.
- Agora libmagic.soestá ligado contra libsome2.so. Obviamente, sem o uso de scripts de vinculador para ocultar símbolos libmagic.so, em tempo de execução, todas as chamadas para interfaces libsome2.sosão resolvidas libsome1.so. Isso pode ser confirmado verificando o valor retornado por libVersion()contra o valor da macro LIB_VERSION.
- Então, tento a seguir compilar e vincular libmagic.soum script vinculador que oculte todos os símbolos, exceto os 3 definidos libmagic.soe exportados por ele. Isso funciona ... Ou pelo menos libVersion()e os LIB_VERSIONvalores correspondem (e relata a versão 2 e não 1).
- No entanto, quando algumas estruturas de dados são serializadas em disco, notei alguma corrupção. No diretório do aplicativo, se eu excluir libsome1.soe criar um link virtual em seu lugar para apontar libsome2.so, tudo funcionará conforme o esperado e a mesma corrupção não ocorrerá.
Não posso deixar de pensar que isso pode ser causado devido a algum conflito na resolução de símbolos do vinculador em tempo de execução. Eu tentei muitas coisas, como tentar vincular libsome2.sopara que todos os símbolos sejam aliados symbol@@VER_2(sobre o qual ainda estou confuso porque o comando nm -CD libsome2.soainda lista os símbolos como symbole não symbol@@VER_2) ... Nada parece funcionar !!! Socorro!!!!!!
RTLD_LOCALe RTLD_DEEPBINDdlopen no seu aplicativo. Não tenho tempo para testar isso agora, mas deve funcionar com base na página de manual.