実行時リンカーは、Solaris上で実行可能でRPATHを無視します
-
26-09-2019 - |
質問
私はルートを持っていないSolarisサーバ上でコンパイル samtools にしようとしています。 Samtoolsはzlibのに依存します。 samtoolsだけの小さなファイルを扱う:このバージョンに対してコンパイルsamtoolsが期待される効果を持っているように、このマシンのシステムのzlibは、大容量ファイルのサポート付きでコンパイルされていません。私は大きなファイルを扱うことができるようにする必要があります。幸いなことに、大容量のファイルをサポートして/usr/local/apps/zlib-1.2.5/に管理者によってコンパイルされたzlibのバージョンがあります。私はCFLAGSに-R /usr/local/apps/zlib-1.2.5/lib
を追加することで、この問題に対処してコンパイルすることができますが、これは仕事にではないようです。次のような症状があります:
私はsamtoolsを実行しようとすると、それはこのエラーでクラッシュします:
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を使用せずに、実行時に/usr/local/apps/zlib-1.2.5/lib
で検索するsamtoolsを強制することができますどのように?
編集:ここに -R
オプションを行うには正しいものであることを示すように思われます。しかし、それは動作しません。
解決
私は決して、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ができ、ことを決議それ?