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.soe libsome2.so.
- Un'applicazione è collegata libsome1.so.
- Questa applicazione usa libdl.soper 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.sovengono 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.socon uno script di linker che nasconde tutti i simboli tranne 3 che sono definiti in libmagic.soe sono esportati da esso. Funziona ... O almeno libVersion()e i LIB_VERSIONvalori 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.soe 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.somodo che tutti i simboli siano allineati symbol@@VER_2(di cui sono ancora confuso perché il comando nm -CD libsome2.soelenca ancora i simboli come symbole non symbol@@VER_2) ... Niente sembra funzionare !!! Aiuto!!!!!!
RTLD_LOCALe RTLD_DEEPBINDapri nell'app. Non ho tempo di provarlo ora, ma dovrebbe funzionare in base alla manpage.