2011-11-01 9 views
17

Esta página - http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/ - dice acerca del orden de búsqueda de la biblioteca en ld.so:usa RPATH pero no RUNPATH?

Unless loading object has RUNPATH: 
    RPATH of the loading object, 
     then the RPATH of its loader (unless it has a RUNPATH), ..., 
     until the end of the chain, which is either the executable 
     or an object loaded by dlopen 
    Unless executable has RUNPATH: 
     RPATH of the executable 
LD_LIBRARY_PATH 
RUNPATH of the loading object 
ld.so.cache 
default dirs 

Y entonces sugieren:

Cuando se envía binarios, o bien utilizar rPath y no RUNPATH o garantizar LD_LIBRARY_PATH se establece antes de que se ejecuten.

Por lo tanto, el uso de RPATH con RUNPATH es malo porque RUNPATH tipo de cancela RPATH carga dinámica de modo indirecto no funciona como se esperaba? Pero ¿por qué entonces RPATH obsoleto a favor de RUNPATH?

¿Alguien puede explicar la situación?

Respuesta

13

Cuando envía un archivo binario, es bueno proporcionar los medios para que los usuarios puedan acomodar el binario a las características específicas de su propio sistema, entre otras cosas, ajustando las rutas de búsqueda de la biblioteca.

Un usuario generalmente puede ajustar LD_LIBRARY_PATH y /etc/ld.co.conf, ambos de los cuales está con menor precedencia que DT_RPATH, es decir, no se puede anular lo que está codificado en el binario, mientras que si se utiliza DT_RUNPATH lugar, un usuario puede anular con LD_LIBRARY_PATH .

(FWIW, creo que ld.so.conf también debe tener prioridad sobre DT_RUNPATH, pero, de todos modos, al menos tenemos LD_LIBRARY_PATH).

Además, estoy totalmente en desacuerdo con la sugerencia anterior de utilizar DT_RPATH. IMO, es mejor utilizar nether DT_RPATH no DT_RUNPATH en binarios enviados.

menos

usted 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 de uso DT_RPATH.

+1

problema es que se recomienda RUNPATH sobre RPATH y RPATH está en desuso, pero RUNPATH actualmente no es compatible con todos los sistemas. entonces, ¿qué hago ** hoy ** para hacer que la aplicación funcione? como muestra el artículo de Qt, cuando se usan complementos, es útil usar RPATH más que RUNPATH. entonces la situación es muy confusa aquí. – zaharpopov

+1

@zaharpopov. El mejor enfoque que recomendaría y seguiría es producir aplicaciones que estén bien integradas en la plataforma objetivo, lo que incluiría, entre otras cosas, * no distribuir versiones competidoras de la plataforma bibliotecas compartidas *. Creo que esta es la raíz del problema, y ​​los ataques y las cuchilladas en torno a 'DT_RPATH' y sus amigos son un esfuerzo mal dirigido que trata de eludir el problema en lugar de resolverlo. – chill

+1

esto no es simple. con el problema de Qt, la aplicación quiere una versión más nueva de lib de Qt que existe en el sistema. algunos sistemas tienen anticuados Qt SOs, entonces, ¿qué harías entonces? Creo que tiene sentido distribuir Qt SO con usted si necesita una versión específica – zaharpopov

10

La respuesta de Chill es exactamente correcta; Simplemente quería agregar un poco de color, a partir de una lectura reciente de la fuente glibc ([master 8b0ccb2], en 2.17). Para ser claros, si no se encuentra una biblioteca en la ubicación especificada por un nivel determinado, se intenta el siguiente nivel. Si se encuentra una biblioteca en un nivel determinado, la búsqueda se detiene.

dinámico Biblioteca Orden de búsqueda:

  1. DT_RPATH en el binario ELF, a menos que DT_RUNPATH conjunto.
  2. entradas LD_LIBRARY_PATH, a menos que setuid/setgid
  3. DT_RUNPATH en las entradas de
  4. /etc/ld.so.cache binarios ELF, a menos que nodeflib -z dado en tiempo de enlace
  5. /lib,/usr/lib menos - z nodeflib
  6. Hecho, "no encontrado".
4

Pero por qué entonces rPath quedó desfasada y en RUNPATH?

Cuando se introdujo DT_RPATH, tenía prioridad sobre todos los demás parámetros. Esto imposibilitó anular la ruta de búsqueda de bibliotecas incluso para fines de desarrollo. Por lo tanto, se introdujo otro parámetro, LD_RUNPATH, que tiene una precedencia menor que LD_LIBRARY_PATH.

Más detalles se pueden encontrar en el trabajo "How to write shared libraries" escrito por Ulrich Drepper.

+1

Esta respuesta explica la necesidad de 'DT_RUNPATH', pero no por qué' DT_RPATH' está en desuso. Ambos tienen su propio uso, y 'DT_RUNPATH' rompe' libtool' cuando se usa 'LD_LIBRARY_PATH': https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732 – vinc17

Cuestiones relacionadas