soname viene utilizzato per indicare quale compatibilità di API binarie supporta la libreria.
SONAME
viene utilizzato in fase di compilazione dal linker per determinare dal file della libreria quale versione della libreria di destinazione effettiva. gcc -l NAME
cercherà per lib NAME
.so collegamento o file quindi catturare il suo SONAME che sarà certamente più specifico (ex libnuke.so link a libnuke.so.0.1.4 che contiene SONAME libnuke.so.0).
In fase di esecuzione il collegamento con questo viene quindi impostato nella sezione dinamica ELF NEEDED
, quindi deve esistere una libreria con questo nome (o un collegamento ad essa). In fase di esecuzione SONAME
viene ignorato, quindi è sufficiente il collegamento o l'esistenza del file.
Nota: SONAME viene applicato solo al collegamento/tempo di creazione e non in fase di esecuzione.
'SONAME' della libreria può essere visto con 'objdump -p file | grep SONAME'. 'NEEDED' dei binari può essere visto con 'objdump -p file | grep NEEDED'.
[EDIT] AVVERTENZA Di seguito è riportato un commento generale, non quello distribuito in linux. Vedi alla fine.
Supponiamo di avere una biblioteca con nome libnuke.so.1.2 e si sviluppa una nuova libreria libnuke:
- se la nuova libreria è una correzione dal precedente senza cambiare api, si dovrebbe tenere nello stesso soname , aumenta la versione del nome file. cioè il file sarà libnuke.so.1.2.1 ma il soname sarà ancora libnuke.so.1.2.
- se si dispone di una nuova libreria che ha solo aggiunto una nuova funzione ma non ha interrotto la funzionalità ed è ancora compatibile con la precedente si desidera utilizzare lo stesso soname del precedente più un nuovo suffisso come .1. cioè file e soname saranno libnuke.so.1.2.1. Qualsiasi programma collegato con libnuke.1.2 continuerà a funzionare con quello. I nuovi programmi collegati con libnuke.1.2.1 funzioneranno solo con quello (fino a quando la nuova subversione non sarà come libnuke.1.2.1.1).
- se la nuova libreria non è compatibile con qualsiasi libnuke: libnuke.so.2
- se la nuova libreria è compatibile con la versione precedente nuda: libnuke.so.1.3 [cioè ancora compatibile con libnuke.so.1]
[EDIT] per completare: caso di Linux.
In Linux Soname vita reale come una forma specifica. lib [NAME] [API-VERSION] .quindi [versione principale] versione principale è solo un valore intero che aumenta ad ogni cambiamento importante biblioteca. API-VERSION è vuota di default
ex libnuke.so.0
Poi vero nome del file includono le versioni minori e sovversioni es: libnuke.so.0.1.5
penso che non fornire un soname è una cattiva pratica dal momento che la rinomina del file cambierà il suo comportamento.
fonte
2013-01-30 20:56:05
Philippe, secondo David A. Wheeler (http://bit.ly/1CkQJmR), il soname ha un unico numero di versione, come libnuke. so.1 o libnuke.so.4. Sai se un secondo numero di versione può effettivamente far parte del soname, come libnuke.so.1.2? –
Beh, esistono esecuzioni con più cifre, ad esempio per la libreria openssl: SONAME: libssl.so.0.9.8, ma hai ragione è più generale di "Program Library HOWTO" che è debian che sembra più restrittivo in effetti –
Sembra per descrivere che il nome file e il soname dovrebbero essere impostati in modo diverso, ma non descrivere come il soname debba essere impostato nei casi successivi. – poolie