Question

Je suis en train de compiler samtools sur un serveur Solaris où je n'ai pas racine. Samtools dépend de zlib. Le zlib du système sur cette machine est compilée avec le support des grands fichiers, afin de compiler samtools contre cette version a l'effet escompté: samtools ne traitent que de petits fichiers. J'ai besoin pour être en mesure de gérer des fichiers volumineux. Heureusement, il existe une version de zlib compilé par l'administrateur dans /usr/local/apps/zlib-1.2.5/ avec un grand support de fichiers. Je peux compiler contre en ajoutant -R /usr/local/apps/zlib-1.2.5/lib à CFLAGS, mais cela ne semble pas au travail. Les symptômes sont les suivants:

Quand je tente de lancer samtools, il se bloque avec cette erreur:

ld.so.1: samtools: fatal: relocation error: file samtools: symbol gzopen64: referenced symbol not found

Si j'ajoute /usr/local/apps/zlib-1.2.5/ à LD_LIBRARY_PATH, puis samtools fonctionne très bien.

Analyse samtools avec ldd et readelf donne ce qui suit:

$ 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]

/usr/local/apps/zlib-1.2.5/lib est clairement dans l'RPATH du binaire, que je comprends est censé être recherché lors de l'exécution des bibliothèques partagées. Cependant, ldd -s montre que ce répertoire est jamais recherché. L'ajout de ce chemin à LD_LIBRARY_PATH et réexécuter les commandes ldd a l'effet escompté:. Le répertoire est recherché et la version correcte de libz se trouve

Alors, comment puis-je forcer samtools à rechercher dans /usr/local/apps/zlib-1.2.5/lib lors de l'exécution sans utiliser LD_LIBRARY_PATH?


Edit: La documentation ici semble indiquer que l'option -R est la bonne chose à faire. Mais cela ne fonctionne pas.

Était-ce utile?

La solution

Je ne suis pas un expert Solaris, mais cette ligne:

find object=libz.so; required by samtools
 search path=/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib  (LD_LIBRARY_PATH)

me semble indiquer que LD_LIBRARY_PATH est déjà défini, et le chemin de /usr/lib en elle prend la priorité sur tous les chemins de l'éditeur de liens d'exécution. Pouvez-vous unset LD_LIBRARY_PATH si elle est présente et fait voir si cela résout-il?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top