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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top