I binari stessi sanno da quale versione di una libreria condivisa dipendono e la richiedono in modo specifico. Puoi usare ldd
per mostrare le dipendenze; mio per ls
sono:
$ ldd /bin/ls
linux-gate.so.1 => (0xb784e000)
librt.so.1 => /lib/librt.so.1 (0xb782c000)
libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
libc.so.6 => /lib/libc.so.6 (0xb76dc000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
/lib/ld-linux.so.2 (0xb784f000)
libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)
Come puoi vedere, indica ad es. libpthread.so.0
, non solo libpthread.so
.
Il motivo del collegamento simbolico è per il linker. Quando vuoi collegarti a libpthread.so
direttamente, dai gcc
la bandiera -lpthread
, e aggiunge il lib
prefisso e .so
suffisso automaticamente. Non puoi dirgli di aggiungere il .so.0
suffisso, quindi il collegamento simbolico punta alla versione più recente della lib per facilitarlo
I numeri nelle librerie condivise sono convenzioni utilizzate in Linux per identificare l'API di una libreria. Tipicamente il formato è:
libFOO.so.MAJOR.MINOR
E come hai notato di solito c'è un collegamento simbolico da libFOO.so a libFOO.so.MAJOR.MINOR. ldconfig è responsabile dell'aggiornamento di questo collegamento alla versione più recente.
Il MAJOR viene in genere incrementato quando l'API cambia (i nuovi punti di ingresso vengono rimossi o i parametri o i tipi vengono modificati). Il MINOR in genere viene incrementato per i rilasci di correzione di bug o quando vengono introdotte nuove API senza interrompere le API esistenti.
Una discussione più ampia può essere trovata qui:Dissezione delle librerie condivise
Le librerie condivise dovrebbero essere versionate secondo il seguente schema:
blah.so.X.Y.Z
dove
- X =versione ABI non compatibile con le versioni precedenti
- Y =versione ABI retrocompatibile
- Z =Solo modifiche interne - nessuna modifica all'ABI
In genere vedi solo la prima cifra come hello.so.1
perché la prima cifra è l'unica cosa necessaria per identificare la "versione" della libreria poiché tutte le altre cifre sono retrocompatibili.
ldconfig
mantiene una tabella di quali librerie condivise sono disponibili su un sistema e dove esiste il percorso di quella libreria. Puoi verificarlo eseguendo:
ldconfig -p
Quando un pacchetto viene compilato per qualcosa come Red Hat, le librerie condivise richiamate nel file binario verranno cercate e aggiunte come dipendenze del pacchetto al momento della compilazione dell'RPM. Pertanto, quando vai ad installare il pacchetto, il programma di installazione cercherà se hello.so.1
è installato sul sistema controllando ldconfig
.
Puoi vedere le dipendenze di un pacchetto facendo qualcosa come:
rpm -qpR hello.rpm
Questo sistema (a differenza di Windows) consente più versioni del hello.so
da installare su un sistema ed essere utilizzato da diverse applicazioni contemporaneamente.