GNU/Linux >> Tutoriales Linux >  >> Linux

usar RPATH pero no RUNPATH?

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:

  1. DT_RPATH en el binario ELF, a menos que se establezca DT_RUNPATH.
  2. Entradas LD_LIBRARY_PATH, a menos que setuid/setgid
  3. DT_RUNPATH en binario ELF
  4. /etc/ld.so.cache entradas, a menos que se proporcione -z nodeflib en el momento del enlace
  5. /lib, /usr/lib a menos que -z nodeflib
  6. Hecho, "no encontrado".

Linux
  1. ¿Hacer la instalación, pero no en los directorios predeterminados?

  2. Ejecute el script con rc.local:el script funciona, pero no al arrancar

  3. php.ini cambia pero no es efectivo en ubuntu

  4. ¿Eliminar la memoria compartida posix cuando no esté en uso?

  5. ¿Puedo cambiar 'rpath' en un binario ya compilado?

Linux:¿por qué usamos Su y no solo Su?

¿Puede un script ser ejecutable pero no legible?

¿Comando no encontrado en Zsh, pero encontrado en Bash?

Debian 11.3 es tan bueno que simplemente no hay razón para no usarlo

`ssh <host>` es un shell de inicio de sesión, pero `ssh <host> <comando>` no lo es.

dd en todo el disco, pero no quiero una porción vacía