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.

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top