El CÓMO de la biblioteca compartida explica la mayoría de los mecanismos involucrados, y el manual del cargador dinámico entra en más detalles. Cada variante de Unix tiene su propio camino, pero la mayoría usa el mismo formato ejecutable ( ELF ) y tiene vinculadores dinámicos similares (derivados de Solaris). A continuación resumiré el comportamiento común con un enfoque en Linux; Consulte los manuales de su sistema para ver la historia completa.
En pocas palabras, cuando busca una biblioteca dinámica ( .so
archivo), el enlazador intenta:
- directorios listados en la
LD_LIBRARY_PATH
variable de entorno ( DYLD_LIBRARY_PATH
en OSX);
- directorios listados en el rpath del ejecutable ;
- directorios en la ruta de búsqueda del sistema, que (al menos en Linux) consiste en las entradas en
/etc/ld.so.conf
más /lib
y /usr/lib
.
El rpath se almacena en el archivo ejecutable (es el DT_RPATH
o DT_RUNPATH
atributo dinámico). Puede contener rutas absolutas o rutas que comiencen $ORIGIN
por indicar una ruta relativa a la ubicación del ejecutable (por ejemplo, si el ejecutable está dentro /opt/myapp/bin
y su rpath está $ORIGIN/../lib:$ORIGIN/../plugins
entonces, el enlazador dinámico buscará /opt/myapp/lib
y /opt/myapp/plugins
). La ruta normalmente se determina cuando se compila el ejecutable, con la -rpath
opción de ld
, pero puede cambiarlo después con chrpath
.
En el escenario que usted describe, si usted es el desarrollador o con el empaquetador de la aplicación y tiene la intención de que sea instalado en una …/bin
, …/lib
estructura, y luego enlazar con -rpath='$ORIGIN/../lib'
. Si está instalando un binario precompilado en su sistema, coloque la biblioteca en un directorio en la ruta de búsqueda ( /usr/local/lib
si es el administrador del sistema, de lo contrario, un directorio al que agregará $LD_LIBRARY_PATH
), o intente chrpath
.
/lib64
y/usr/lib64
se utilizan para 64 binarios bits y/lib
y/usr/lib
se utilizan para 32 binarios bits.