2010-11-19 7 views
4

samtools私はルートを持っていないSolarisサーバー上でコンパイルしようとしています。 Samtoolsはzlibに依存します。このマシンのシステムzlibは大きなファイルサポートでコンパイルされていないため、このバージョンに対してsamtoolsをコンパイルすると、期待される効果があります.samtoolsは小さなファイルのみを処理します。私は大きなファイルを扱うことができるようにする必要があります。幸いにも、/usr/local/apps/zlib-1.2.5/に管理者によってコンパイルされたzlibのバージョンがあり、大きなファイルがサポートされています。 CFLAGSに-R /usr/local/apps/zlib-1.2.5/libを追加することでコンパイルできますが、これはうまくいかないようです。次のような症状があります:私はsamtoolsを実行しようとすると実行時リンカーはsolaris上の実行可能ファイル内のRPATHを無視します

、それがこのエラーでクラッシュ:

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

私はLD_LIBRARY_PATHに/usr/local/apps/zlib-1.2.5/を追加する場合は、samtoolsが正常に動作します。

LDDとsamtoolsを分析し、readelfがは以下が得られます。

$ 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は、私は理解している、バイナリのRPATHに明確であるが、共有ライブラリのために、実行時に検索されることになっています。ただし、ldd -sは、このディレクトリが決して検索されないことを示しています。このパスをLD_LIBRARY_PATHに追加してlddコマンドを再実行すると、期待される効果が得られます。ディレクトリが検索され、正しいバージョンのlibzが見つかります。

LD_LIBRARY_PATHを使用せずに、実行時にsamtoolsに/usr/local/apps/zlib-1.2.5/libを強制的に検索させるにはどうすればよいですか?


編集:ドキュメントhere-Rオプションを行うには正しいものであることを示すように思われます。しかし、それは動作しません。

答えて

3

私は決して、Solarisの専門家だが、この行:

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

LD_LIBRARY_PATHがすでに設定されていることを私に示しているようだ、とその中/usr/libパスは、任意の実行時リンカーのパスに優先を取っています。 LD_LIBRARY_PATHが実際に存在する場合はそれを解除し、それが解決するかどうか確認できますか?

+0

Gah!あなたが正しい!しかし、私のinitファイルのどれもそれを設定していないので、どのように設定されているのか分かりません。それにもかかわらず、それを解除すると、物事が機能します。設定が間違っているようです。シェルのinitファイルで設定を解除し、sysadminに電子メールを送ります。 –

+0

少し落ち着いたので、「ありがとう」を追加したいと思います。 –

+0

問題ありません。喜んで助けてください。 – bosmacs

関連する問題