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.ldconfig
.ldconfig
se involucra cuando instala una biblioteca.*.so
bibliotecas no es la misma que$PATH
. La ruta de búsqueda es la dada por @enzotib en su respuesta. Para imprimir las rutas que se buscarán, ejecuteldconfig -v 2>/dev/null | grep -v ^$'\t'
./sbin/ldconfig
y esa otra magia de Andrew Bate para que funcione sin rootEn Linux, el comportamiento se explicita en la
ld(1)
página manfuente
Estoy bastante seguro de que la respuesta aquí es
ldconfig
.http://linux.die.net/man/8/ldconfig
fuente
Para ejecutar aplicaciones, el archivo
/proc/1234/maps
contiene todas las bibliotecas vinculadas dinámicamente.¿Dónde
1234
está el pid del ejecutable en ejecución?Linux sigue LD_LIBRARY_PATH y otras variables, como se señala en la respuesta de Gilles.
fuente