Runtime enlazador ignora rPath en ejecutable en solaris
-
26-09-2019 - |
Pregunta
Estoy tratando de compilación samtools en un servidor Solaris, donde no tengo raíz. Samtools depende de zlib. El sistema de zlib en esta máquina no está compilado con soporte de archivos grandes, por lo que la compilación samtools en contra de esta versión tiene el efecto esperado: samtools sólo manejan archivos pequeños. Necesito que sea capaz de manejar archivos de gran tamaño. Por suerte, hay una versión de zlib compilado por el administrador en /usr/local/apps/zlib-1.2.5/ compatibilidad con archivos grandes. Puedo compilar contra esto añadiendo -R /usr/local/apps/zlib-1.2.5/lib
a CFLAGS, pero esto no parece funcionar. Los síntomas son los siguientes:
Cuando intento ejecutar samtools, se estrella con este error:
ld.so.1: samtools: fatal: relocation error: file samtools: symbol gzopen64: referenced symbol not found
Si añado /usr/local/apps/zlib-1.2.5/
a LD_LIBRARY_PATH, entonces samtools funciona bien.
Analizando samtools con LDD y readelf produce el siguiente:
$ ldd -r samtools
libnsl.so.1 => /usr/lib/libnsl.so.1
libsocket.so.1 => /usr/lib/libsocket.so.1
libresolv.so.2 => /usr/lib/libresolv.so.2
libm.so.2 => /usr/lib/libm.so.2
libcurses.so.1 => /usr/lib/libcurses.so.1
libz.so => /usr/lib/libz.so
libc.so.1 => /usr/lib/libc.so.1
libmp.so.2 => /usr/lib/libmp.so.2
libmd.so.1 => /usr/lib/libmd.so.1
libscf.so.1 => /usr/lib/libscf.so.1
libdoor.so.1 => /usr/lib/libdoor.so.1
libuutil.so.1 => /usr/lib/libuutil.so.1
libgen.so.1 => /usr/lib/libgen.so.1
symbol not found: gzopen64 (samtools)
$ ldd -s samtools
...(snip)...
find object=libz.so; required by samtools
search path=/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib (LD_LIBRARY_PATH)
trying path=/usr/lib/libz.so
libz.so => /usr/lib/libz.so
...(snip)...
$ readelf -d samtools | grep RPATH
0x0000000f (RPATH) Library rpath: [/usr/local/apps/zlib-1.2.5/lib:/usr/local/apps/gcc-4.5.1/lib]
Así /usr/local/apps/zlib-1.2.5/lib
está claramente en rPath de la binaria, que entiendo que se supone que se debe buscar en tiempo de ejecución para las bibliotecas compartidas. Sin embargo, muestra ldd -s
que este directorio no se buscaron. La adición de este camino a LD_LIBRARY_PATH y volver a ejecutar los comandos LDD tiene el efecto esperado:. Directorio es buscado y la versión correcta de libz se encuentra
Entonces, ¿cómo puedo forzar samtools para buscar en /usr/local/apps/zlib-1.2.5/lib
en tiempo de ejecución sin necesidad de utilizar LD_LIBRARY_PATH?
Edit: La documentación aquí parecería indicar que la opción -R
es lo correcto a hacer. Pero no funciona.
Solución
Estoy de ninguna manera un experto en Solaris, pero esta línea:
find object=libz.so; required by samtools
search path=/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib (LD_LIBRARY_PATH)
parece indicar que a mí LD_LIBRARY_PATH
ya está establecido, y el camino /usr/lib
en ella está tomando precedencia sobre cualquier ruta de enlaces de ejecución. ¿Puede usted LD_LIBRARY_PATH desactivada si se trata, de hecho, presente y ver si se soluciona que?