Runtime linker ignora RPATH in eseguibile su Solaris
-
26-09-2019 - |
Domanda
Sto cercando di compilazione samtools sul server Solaris in cui non ho root. Samtools dipende zlib. Lo zlib di sistema su questa macchina non è compilato con il supporto di file di grandi dimensioni, in modo da compilare samtools contro questa versione ha l'effetto atteso: samtools gestire solo file di piccole dimensioni. Ho bisogno di essere in grado di gestire file di grandi dimensioni. Per fortuna, c'è una versione di zlib compilato dal admin in /usr/local/apps/zlib-1.2.5/ con supporto di file di grandi dimensioni. Posso compilare contro questo con l'aggiunta di -R /usr/local/apps/zlib-1.2.5/lib
a CFLAGS, ma questo non sembra funzionare. I sintomi sono i seguenti:
Quando provo a fare funzionare samtools, si blocca con questo errore:
ld.so.1: samtools: fatal: relocation error: file samtools: symbol gzopen64: referenced symbol not found
Se aggiungo /usr/local/apps/zlib-1.2.5/
a LD_LIBRARY_PATH, poi samtools funziona bene.
L'analisi samtools con LDD e readelf ottengono i seguenti:
$ 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]
Quindi /usr/local/apps/zlib-1.2.5/lib
è chiaramente in RPATH del binario, che ho capito dovrebbe essere cercato in fase di esecuzione per le librerie condivise. Tuttavia, spettacoli ldd -s
che questa directory non è mai cercati. L'aggiunta di questo percorso per LD_LIBRARY_PATH e ri-esecuzione dei comandi LDD ha l'effetto atteso:. La directory è cercato e la versione corretta di libz è trovato
Così come posso forzare samtools per la ricerca in /usr/local/apps/zlib-1.2.5/lib
in fase di esecuzione senza l'utilizzo di LD_LIBRARY_PATH?
Modifica: La documentazione qui sembrerebbe indicare che l'opzione -R
è la cosa giusta da fare. Ma non funziona.
Soluzione
Sono in alcun modo un esperto di Solaris, ma questa linea:
find object=libz.so; required by samtools
search path=/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib (LD_LIBRARY_PATH)
sembra indicare a me che LD_LIBRARY_PATH
è già impostato, e il percorso /usr/lib
in esso sta prendendo la precedenza su eventuali percorsi di runtime linker. Can LD_LIBRARY_PATH si torna dall 'se è in realtà presente e vedere se questo risolve?