Cuando envía un binario, es bueno proporcionar medios para que los usuarios acomoden el binario a las especificaciones de su propio sistema, entre otras cosas, ajustando las rutas de búsqueda de la biblioteca.
Un usuario generalmente puede modificar LD_LIBRARY_PATH
y /etc/ld.so.conf
, ambos con menor precedencia que DT_RPATH
, es decir, no puede anular lo que está codificado en el binario, mientras que si usa DT_RUNPATH
en cambio, un usuario puede anularlo con LD_LIBRARY_PATH
.
(FWIW, creo que ld.so.conf
también debería tener prioridad sobre DT_RUNPATH
, pero, de todos modos, al menos tenemos LD_LIBRARY_PATH
).
Además, no estoy de acuerdo con la sugerencia anterior de usar DT_RPATH
. En mi opinión, es mejor usar nether DT_RPATH
no DT_RUNPATH
en binarios enviados.
a menos que
envía todas sus bibliotecas dependientes con sus ejecutables y desea asegurarse de que las cosas JustWork(tm) después de la instalación, en este caso use DT_RPATH
.
¿Pero por qué entonces RPATH quedó en desuso en favor de RUNPATH?
Cuando se introdujo DT_RPATH, tenía prioridad sobre todos los demás parámetros. Esto hizo imposible anular la ruta de búsqueda de bibliotecas incluso con fines de desarrollo. Por lo tanto, se introdujo otro parámetro, LD_RUNPATH, que tiene menor prioridad que LD_LIBRARY_PATH.
Se pueden encontrar más detalles en el trabajo "Cómo escribir bibliotecas compartidas" escrito por Ulrich Drepper .
La respuesta de Chill es exactamente correcta; Simplemente quería agregar algo de color, de una lectura reciente de la fuente glibc ([master 8b0ccb2], en 2.17). Para ser claros, si una biblioteca no se encuentra en la ubicación especificada por un nivel determinado, se intenta con el siguiente nivel. Si se encuentra una biblioteca en un nivel determinado, la búsqueda se detiene.
Orden de búsqueda de la biblioteca dinámica:
- DT_RPATH en el binario ELF, a menos que se establezca DT_RUNPATH.
- Entradas LD_LIBRARY_PATH, a menos que setuid/setgid
- DT_RUNPATH en binario ELF
- /etc/ld.so.cache entradas, a menos que se proporcione -z nodeflib en el momento del enlace
- /lib, /usr/lib a menos que -z nodeflib
- Hecho, "no encontrado".