¿Dónde buscan los files ejecutables objects compartidos en time de ejecución?

Entiendo cómo definir include objects compartidos en el time de vinculación / compilation. Sin embargo, todavía me pregunto cómo buscan los ejecutables el object compartido ( *.so libraries) en el momento de la ejecución.

Por ejemplo, mi aplicación a.out llama a funciones definidas en la biblioteca lib.so Después de comstackr, muevo lib.so a un nuevo directory en my $HOME .

¿Cómo puedo decirle a.out que vaya a searchlo allí?

El HOWTO de la biblioteca compartida explica la mayoría de los mecanismos involucrados, y el manual del cargador dynamic entra en más detalles. Cada variante de Unix tiene su propio path, pero la mayoría usa el mismo formatting ejecutable ( ELF ) y tiene vinculadores dynamics similares (derivados de Solaris). A continuación resumiré el comportamiento común con un enfoque en Linux; revise los manuales de su sistema para la historia completa.

En pocas palabras, cuando busca una biblioteca dinámica (file .so ) el linker intenta:

  • directorys enumerados en la LD_LIBRARY_PATH entorno LD_LIBRARY_PATH ( DYLD_LIBRARY_PATH en OSX);
  • directorys enumerados en el rpath del ejecutable;
  • directorys en la ruta de búsqueda del sistema, que (al less en Linux) consiste en las inputs en /etc/ld.so.conf plus /lib y /usr/lib .

El rpath se almacena en el ejecutable (es el atributo dynamic DT_RPATH o DT_RUNPATH ). Puede contener routes o routes absolutas comenzando con $ORIGIN para indicar una ruta relativa a la location del ejecutable (por ejemplo, si el ejecutable está en /opt/myapp/bin y su ruta de acceso es $ORIGIN/../lib:$ORIGIN/../plugins entonces el linker dynamic se verá en /opt/myapp/lib y /opt/myapp/plugins ). El rpath normalmente se determina cuando se comstack el ejecutable, con la opción -rpath a ld , pero puede cambiarlo después con chrpath .

En el escenario que describes, si eres el desarrollador o el empaquetador de la aplicación y quieres que se instale en una estructura …/bin , …/lib , entonces vincula con -rpath='$ORIGIN/../lib' . Si está instalando un binary preconstruido en su sistema, coloque la biblioteca en un directory en la ruta de búsqueda ( /usr/local/lib si es el administrador del sistema, de lo contrario, un directory que agregue a $LD_LIBRARY_PATH ) , o testing chrpath .

En Linux, el comportamiento se explicita en la página de ld(1) man ld(1)

  The linker uses the following search paths to locate requinetworking shanetworking libraries: 1. Any directories specified by -rpath-link options. 2. Any directories specified by -rpath options. The difference between -rpath and -rpath-link is that directories specified by -rpath options are included in the executable and used at runtime, whereas the -rpath-link option is only effective at link time. Searching -rpath in this way is only supported by native linkers and cross linkers which have been configunetworking with the --with-sysroot option. 3. On an ELF system, for native linkers, if the -rpath and -rpath-link options were not used, search the contents of the environment variable "LD_RUN_PATH". 4. On SunOS, if the -rpath option was not used, search any directories specified using -L options. 5. For a native linker, the search the contents of the environment variable "LD_LIBRARY_PATH". 6. For a native ELF linker, the directories in "DT_RUNPATH" or "DT_RPATH" of a shanetworking library are searched for shanetworking libraries needed by it. The "DT_RPATH" entries are ignonetworking if "DT_RUNPATH" entries exist. 7. The default directories, normally /lib and /usr/lib. 8. For a native linker on an ELF system, if the file /etc/ld.so.conf exists, the list of directories found in that file. If the requinetworking shanetworking library is not found, the linker will issue a warning and continue with the link. 

Estoy bastante seguro de que la respuesta aquí es ldconfig .

ldconfig crea los enlaces y la memory caching necesarios para las bibliotecas compartidas más recientes que se encuentran en los directorys especificados en la command-line, en el file /etc/ld.so.conf, y en los directorys de confianza (/ lib y / usr / lib). La caching es utilizada por el linker en time de ejecución, ld.so o ld-linux.so. ldconfig comtesting el encabezado y los nombres de file de las bibliotecas que encuentra al determinar qué versiones deben tener sus enlaces actualizados.

http://linux.die.net/man/8/ldconfig

Para ejecutar aplicaciones, el file /proc/1234/maps contiene todas las bibliotecas vinculadas dinámicamente.

Donde 1234 es el pid del ejecutable ejecutable.

Linux sigue LD_LIBRARY_PATH y otras variables, como se señala en la respuesta de Gilles.