2011-01-11 18 views
8

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.solibsqlite3.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?

+0

Hai provato a http://unix.stackexchange.com/? – joksnet

+2

@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

+0

Sì! Perché è ancora in beta e non ha il dominio proprio. – joksnet

risposta

4

provare a compilare sia libsome1.so e libsome2.so di aggiungere il simbolo delle versioni, ognuna con la propria versione (utilizzare l'opzione --version-script-ld). Quindi collegare l'applicazione e libmagic.so utilizzando le nuove librerie. Quindi, libsome1.so e libsome2.so devono essere completamente separati.

I problemi possono ancora verificarsi se sono presenti riferimenti non espressi ai simboli. Tali riferimenti possono essere soddisfatti dalle definizioni delle versioni (in modo che sia possibile aggiungere il controllo delle versioni dei simboli a una libreria senza rompere la compatibilità binaria). Se ci sono più simboli con lo stesso nome, a volte può essere difficile prevedere quale sarà utilizzato.

Per quanto riguarda gli strumenti, nm -D non visualizza alcuna informazione sul controllo delle versioni dei simboli. Prova objdump -T o readelf -s invece.

+0

Grazie per le informazioni. Ho imparato qualcosa di nuovo! Probabilmente avrei dovuto parlarne prima, ma l'app in questione è Firefox e 'libsome1.so' è' libsqlite3.so' fornito con esso. Quindi non c'è modo che io abbia la possibilità di ricompilarli. Comunque ho provato la tua soluzione sul campione minimalista che avevo creato per modellare la situazione ... E ha funzionato! – themoondothshine

+0

+1 alla tua risposta per avermi insegnato qualcosa di nuovo! – themoondothshine

+0

Ti conferisco la taglia. Penso che questo sia meritato; la tua risposta è buona Avere un altro rep! –

Problemi correlati