2012-09-28 27 views
33

Me enteré de "Program Library HOWTO". Menciona que usando soname para administrar la versión como sigue.¿Para qué sirve la opción 'sonar' para crear bibliotecas compartidas?

gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.0 foo.c 
ln -s libfoo.so.1.0.0 libfoo.so.1 
ln -s libfoo.so.1 libfoo.so 

y me da la información que si el soname no está establecida. será igual a libfoo.so.1.0.0, vea la respuesta de here.

Y me parece que también puede funcionar sin soname, como seguir

gcc -shared -fPIC -o libfoo.so.1.0.0 foo.c 
ln -s libfoo.so.1.0.0 libfoo.so.1 
ln -s libfoo.so.1 libfoo.so 

tanto, creo que el único punto útil es que la opción soname le puede decir la versión de la biblioteca compartida cuando se utiliza readelf -d libfoo.so comando para verificarlo.

¿Qué más puede hacer?

Respuesta

38

soname se utiliza para indicar lo que la compatibilidad binaria api su apoyo biblioteca.

SONAME se utiliza en tiempo de compilación por enlazador para determinar a partir del archivo de la biblioteca lo real versión de la biblioteca de destino. gcc -l NAME buscará la lib .so NAME enlace o archivo y luego capturar su SONAME que sin duda ser más específicos (por ejemplo libnuke.so enlaces a libnuke.so.0.1.4 que contiene SONAME libnuke.so.0).

En tiempo de ejecución se vinculará con esto luego se establece en la sección dinámica ELF NEEDED, entonces una biblioteca con este nombre (o un enlace) debe existir. En tiempo de ejecución SONAME se descarta, por lo que solo el enlace o la existencia del archivo es suficiente.

Observación: SONAME solo se aplica durante el tiempo de enlace/compilación y no en tiempo de ejecución.

'SONAME' de la biblioteca se puede ver con '-p fichero objdump | grep SONAME'. 'NECESARIO' de binarios se puede ver con 'objdump -p archivo | grep NECESARIO'.

[EDITAR] ADVERTENCIA La siguiente es una observación general, no la que se despliega en Linux. Ver al final.

Supongamos que usted tiene una biblioteca con el nombre libnuke.so.1.2 y desarrolla una nueva biblioteca libnuke:

  • si su nueva biblioteca es una solución de la anterior sin cambio de API, sólo debe mantener misma soname , aumenta la versión de nombre de archivo. es decir, el archivo será libnuke.so.1.2.1 pero soname seguirá siendo libnuke.so.1.2.
  • si tiene una nueva biblioteca que solo agregó una nueva función pero no rompió la funcionalidad y sigue siendo compatible con la anterior, le gustaría usar el mismo soname que el anterior más un nuevo sufijo como .1. es decir, file y soname serán libnuke.so.1.2.1. Cualquier programa vinculado con libnuke.1.2 seguirá funcionando con ese. Los nuevos programas vinculados con libnuke.1.2.1 solo funcionarán con ese (hasta que la nueva subversión llegue como libnuke.1.2.1.1).
  • si su nueva biblioteca no es compatible con ningún libnuke: libnuke.so.2
  • si su nueva biblioteca es compatible con la versión antigua: libnuke.so.1.3 [es decir, sigue siendo compatible con libnuke.so.1]

[EDITAR] para completar: caso de linux.

En SONAME vida real Linux como una forma específica:. lib [NOMBRE] [API-VERSION] .so [major-version] versión principal es sólo un valor entero que aumentar en cada cambio importante biblioteca. API-VERSIÓN está vacío por defecto

ex libnuke.so.0

A continuación, el nombre de archivo real, incluyen versiones y subversiones menores ejemplo: libnuke.so.0.1.5

creo que no proporcionar un soname es una mala práctica ya que el cambio de nombre del archivo cambiará su comportamiento.

+1

Philippe, de acuerdo con David A. Wheeler (http://bit.ly/1CkQJmR), el soname tiene un único número de versión, como libnuke. so.1 o libnuke.so.4. ¿Sabes si un segundo número de versión puede ser parte del soname, como libnuke.so.1.2? –

+0

Bueno, existen sonmae con múltiples dígitos, por ejemplo para la biblioteca de openssl: SONAME: libssl.so.0.9.8, pero tienes razón, es más general que "Program Library HOWTO" que es debian que parece más restrictivo de hecho –

+0

Pareces para describir que el nombre del archivo y el nombre del sonido se deben establecer de forma diferente, pero no se describe cómo debe configurarse el nombre del sonido en los casos posteriores. – poolie

0

Otro aspecto: Al menos en Linux la entrada SONAME proporciona una pista para el sistema de ejecución-enlazador sobre cómo crear enlaces apropiados en/lib,/lib64 etc. Ejecutar el comando ldconfig trata de crear un enlace simbólico llamado con SONAME, que también se toma en el caché del enlazador en tiempo de ejecución. La más nueva de las bibliotecas que etiquetan el mismo SONAME gana la carrera de enlace. Si algún software se basa en el SONAME específico y desea renovar una biblioteca, debe proporcionar este SONAME para obtener ldconfig stick en esta nueva biblioteca (si ldconfig se usa para reconstruir el caché y los enlaces). P.ej. libssl.so.6 y libcrypto.so.6 son tales casos.

1

Supongamos que libA.so depende de libB.so, y todos en un directorio (por supuesto, el directorio no puede encontrar el directorio). Si no configuró soname continuación dlopen no funciona:

auto pB = dlopen("./libB.so", RTLD_LAZY | RTLD_GLOBAL); 
auto pA = dlopen("./libA.so", RTLD_LAZY | RTLD_GLOBAL); 

Debido editor de enlaces de libB.so no puede encontrar, por lo que se establece en pANULL.

En este caso soname le ahorrará desde el infierno ...