Sto cercando di saperne di più sul controllo delle versioni delle librerie in Linux e su come far funzionare tutto. Ecco il contesto:
- Ho due versioni di una libreria dinamica che espongono lo stesso set di interfacce, diciamo libsome1.so
e libsome2.so
.
- Un'applicazione è collegata libsome1.so
.
- Questa applicazione usa libdl.so
per caricare dinamicamente un altro modulo, diciamo libmagic.so
.
- Ora libmagic.so
è collegato contro libsome2.so
. Ovviamente, senza utilizzare gli script del linker per nascondere i simboli libmagic.so
, in fase di esecuzione tutte le chiamate alle interfacce libsome2.so
vengono risolte libsome1.so
. Ciò può essere confermato controllando il valore restituito dal libVersion()
valore della macro LIB_VERSION
.
- Quindi provo a compilare e collegare libmagic.so
con uno script di linker che nasconde tutti i simboli tranne 3 che sono definiti in libmagic.so
e sono esportati da esso. Funziona ... O almeno libVersion()
e i LIB_VERSION
valori corrispondono (e riporta la versione 2 non 1).
- Tuttavia, quando alcune strutture di dati sono serializzate su disco, ho notato un po 'di corruzione. Nella directory dell'applicazione se elimino libsome1.so
e creo un collegamento soft al suo posto a cui puntare libsome2.so
, tutto funziona come previsto e la stessa corruzione non si verifica.
Non posso fare a meno di pensare che ciò potrebbe essere causato da un conflitto nella risoluzione dei simboli del linker di runtime. Ho provato molte cose, come cercare di collegare in libsome2.so
modo che tutti i simboli siano allineati symbol@@VER_2
(di cui sono ancora confuso perché il comando nm -CD libsome2.so
elenca ancora i simboli come symbol
e non symbol@@VER_2
) ... Niente sembra funzionare !!! Aiuto!!!!!!
RTLD_LOCAL
e RTLD_DEEPBIND
apri nell'app. Non ho tempo di provarlo ora, ma dovrebbe funzionare in base alla manpage.