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 ( .soarchivo), el enlazador intenta:
- directorios listados en la
LD_LIBRARY_PATHvariable de entorno ( DYLD_LIBRARY_PATHen 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.confmás /liby /usr/lib.
El rpath se almacena en el archivo ejecutable (es el DT_RPATHo DT_RUNPATHatributo dinámico). Puede contener rutas absolutas o rutas que comiencen $ORIGINpor indicar una ruta relativa a la ubicación del ejecutable (por ejemplo, si el ejecutable está dentro /opt/myapp/biny su rpath está $ORIGIN/../lib:$ORIGIN/../pluginsentonces, el enlazador dinámico buscará /opt/myapp/liby /opt/myapp/plugins). La ruta normalmente se determina cuando se compila el ejecutable, con la -rpathopció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, …/libestructura, 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/libsi es el administrador del sistema, de lo contrario, un directorio al que agregará $LD_LIBRARY_PATH), o intente chrpath.
/lib64y/usr/lib64se utilizan para 64 binarios bits y/liby/usr/libse utilizan para 32 binarios bits.ldconfig.ldconfigse involucra cuando instala una biblioteca.*.sobibliotecas 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/ldconfigy 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/mapscontiene todas las bibliotecas vinculadas dinámicamente.¿Dónde
1234está 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