2011-07-08 14 views
2

私は特有の問題があります。私はgcc-4.2を使ってビルドした共有ライブラリ 'my_tracker.so'を持っています。この共有ライブラリはlibgcc_s.so.1(GCC 4.2)に依存しています。私は 'ldd my_tracker.so'を実行し、/ lib64からlibgcc_s.so.1を取得しました。LD_PRELOADはLD_LIBRARY_PATHを変更します

私は私のスクリプト内の

'LD_PRELOAD=my_tracker.so LD_LIBRARY_PATH=[vnc_install]/lib/vnclibs:$LD_LIBRARY_PATH vncserver' 

を実行しています。私はvncserverが[vnc_install]/lib/vnclibs/からlibgcc_so.1(GCC 3.2.3)を取得していることを確認して、LD_LIBRARY_PATHの前に置いておきたいと思います。

しかし、スクリプトを実行すると、vncserverがlibgcc_s.so.1(GCC 4.2)を/lib64から取得しているように見えます。

プリロードされた共有ライブラリ 'my_tracker.so'の読み込み時にLD_LIBRARY_PATHの前にlibgcc_s.so.1(GCC 4.2)が見つかりましたか?

もしそうなら、どうすればこの問題を解決できますか?

よろしく ジョン

+0

なぜ古いバージョンのlibgcc_s.so.1を使用しようとしていますか? libcなどで新しいバージョンが必要な場合... – bdonlan

+1

vncserverバイナリはありませんlibgcc_s.so.1の古いバージョンへのリンクを使用しています。私はそれを再コンパイルするためのvncserverのソースを持っていません。しかし、より広範な注記では、gccコンパイラのdiffバージョンでコンパイルされたバイナリ(およびdiffバージョンのlibgcc_s.so.1とのリンク)を汎用Linuxシステムでどのように実行できますか? – johnm

答えて

0

これに対する解決策は、patchelfを取得し、RPATHを使用するために、あなたのバイナリ、および任意のコピーされたライブラリにパッチを適用するためにそれを使用することです。次に、LD_LIBRARY_PATHを完全に無視することができます。バイナリをロードするために別のld-linux.soが必要な場合は、patchelfもそのバイナリをフィックスアップして見つけることができます。

+0

この提案をありがとう。私はこれを調べます。しかし、これは一般的な解決策ではないと思います。なぜなら、事前ロードされたライブラリで実行したいすべてのバイナリでpatchelfを実行することができないからです。 – johnm

関連する問題