Durée lieur ignore RPATH dans exécutable sous Solaris
-
26-09-2019 - |
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.
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?