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.so
e libsome2.so
.
- Um aplicativo está vinculado libsome1.so
.
- Este aplicativo usa libdl.so
para carregar dinamicamente outro módulo, digamos libmagic.so
.
- Agora libmagic.so
está 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.so
sã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.so
um script vinculador que oculte todos os símbolos, exceto os 3 definidos libmagic.so
e exportados por ele. Isso funciona ... Ou pelo menos libVersion()
e os LIB_VERSION
valores 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.so
e 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.so
para que todos os símbolos sejam aliados symbol@@VER_2
(sobre o qual ainda estou confuso porque o comando nm -CD libsome2.so
ainda lista os símbolos como symbol
e não symbol@@VER_2
) ... Nada parece funcionar !!! Socorro!!!!!!
RTLD_LOCAL
e RTLD_DEEPBIND
dlopen no seu aplicativo. Não tenho tempo para testar isso agora, mas deve funcionar com base na página de manual.