In realtà, è possibile installare più versioni di una libreria condivisa se è eseguita correttamente.
Le librerie condivise sono generalmente denominate come segue:
lib<name>.so.<api-version>.<minor>
Successivamente, ci sono collegamenti simbolici alla libreria con i seguenti nomi:
lib<name>.so
lib<name>.so.<api-version>
Quando un link di sviluppo contro la libreria per produrre un binario, è il nome del file che termina in .so
che i reperti linker. In effetti, può esserci solo uno di quelli installati alla volta per ogni dato, <name>
ma ciò significa solo che uno sviluppatore non può targetizzare più versioni diverse di una libreria contemporaneamente. Con i gestori di pacchetti, questo .so
collegamento simbolico fa parte di un -dev
pacchetto separato che solo gli sviluppatori devono installare.
Quando il linker trova un file con un nome che termina con .so
e l'usa, si guarda dentro quella libreria per un campo chiamato soname . Il soname indica al linker quale nome file incorporare nel file binario risultante e quindi quale nome file verrà cercato in fase di esecuzione. Il soname dovrebbe essere impostato su lib<name>.so.<api-version>
.
Pertanto, in fase di esecuzione, il linker dinamico lo cercherà lib<name>.so.<api-version>
e lo utilizzerà.
L'intenzione è che:
<minor>
gli aggiornamenti non cambiano l'API della libreria e quando <minor>
viene passata a una versione successiva, è sicuro lasciare che tutti i binari si aggiornino alla nuova versione. Dal momento che tutti i binari cercano la libreria sotto il lib<name>.so.<api-version>
nome, che è un link simbolico all'ultimo installato lib<name>.so.<api-version>.<minor>
, ottengono l'aggiornamento.
<api-version>
gli aggiornamenti cambiano l'API della libreria e non è sicuro lasciare che le applicazioni binarie esistenti utilizzino la nuova versione. Nel caso in cui <api-version>
sia cambiato, poiché quelle applicazioni stanno cercando il nome lib<name>.so.<api-version>
ma con un valore diverso per <api-version>
, non preleveranno la nuova versione.
I gestori pacchetti spesso non impacchettano più di una versione della stessa libreria all'interno della stessa versione di distribuzione poiché l'intera distribuzione, inclusi tutti i file binari che utilizzano la libreria, viene generalmente compilata per utilizzare una versione coerente di ogni libreria prima che la distribuzione sia rilasciato. Assicurarsi che tutto sia coerente e che tutto in una distribuzione sia compatibile con tutto il resto è una parte importante del carico di lavoro per i distributori.
Ma puoi facilmente finire con più versioni di una libreria se hai aggiornato il tuo sistema da una versione della tua distrazione a un'altra e hai ancora dei pacchetti più vecchi che richiedono versioni di librerie più vecchie. Esempio: