Sto cercando di saperne di più sul controllo delle versioni delle librerie in Linux e su come mettere tutto a posto. Ecco il contesto:Linux, GNU GCC, ld, script di versione e formato binario ELF - Come funziona?
- Ho due versioni di una libreria dinamica che espongono lo stesso insieme di interfacce, ad esempio libsome1.so
e libsome2.so
.
- Un'applicazione è collegata a libsome1.so
.
- Questa applicazione utilizza libdl.so
caricare dinamicamente un altro modulo, diciamo libmagic.so
.
- Ora libmagic.so
è collegato a libsome2.so
. Ovviamente, senza utilizzare gli script di linker per nascondere i simboli in libmagic.so
, in fase di esecuzione tutte le chiamate alle interfacce in libsome2.so
vengono risolte in libsome1.so
. Ciò può essere confermato controllando il valore restituito da libVersion()
rispetto al valore della macro LIB_VERSION
.
- così cerco accanto a compilare e collegare libmagic.so
con uno script del linker che nasconde tutti i simboli tranne 3 che sono definite in libmagic.so
e vengono esportati da essa. Funziona ... Almeno libVersion()
e LIB_VERSION
corrispondono (e riporta la versione 2 non 1).
- Tuttavia, quando alcune strutture di dati sono serializzate su disco, ho notato una certa corruzione. Nella directory dell'applicazione se si elimina libsome1.so
e si crea un collegamento software al suo posto per fare riferimento a libsome2.so
, tutto funziona come previsto e non si verifica lo stesso danneggiamento.
Non posso fare a meno di pensare che questo potrebbe essere causato a causa di un conflitto nella risoluzione dei simboli del linker di runtime. Ho provato molte cose, come provare a collegare libsome2.so
in modo che tutti i simboli siano sincronizzati su [email protected]@VER_2
(che sono ancora confuso perché il comando nm -CD libsome2.so
elenca ancora i simboli come symbol
e non [email protected]@VER_2
) ... Nulla sembra funzionare !!! Aiuto!!!!!!
Edit: Avrei detto in precedenza, ma l'applicazione in questione è Firefox, ed è libsome1.so
libsqlite3.so
fornito con esso. Non ho proprio la possibilità di ricompilarli. Inoltre, usare gli script di versione per nascondere i simboli sembra essere l'unica soluzione al momento. Quindi cosa succede veramente quando i simboli sono nascosti? Diventano "locali" nella SO? Non ha alcuna conoscenza della loro esistenza? Cosa succede quando una funzione esportata fa riferimento a un simbolo nascosto?
Hai provato a http://unix.stackexchange.com/? – joksnet
@joksnet: Pensavo che lo stackexchange fosse per gli utenti e non per gli sviluppatori ... Questa domanda è legata allo sviluppo in C++ Linux ... O sono solo deluso? :) Edit: I am wrong !!! Per qualche ragione ho pensato stackexchange = serverfault !! Non ero a conoscenza di unix.stackexchange.com !! – themoondothshine
Sì! Perché è ancora in beta e non ha il dominio proprio. – joksnet