2012-06-05 20 views
7

LD_LIBRARY_PATHの変更に奇妙な副作用があります。LD_LIBRARY_PATHの副作用

ライブラリを含むパスを追加すると、次のようになります。 :

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 

すべてが信じられないほど遅くなります。たとえば、単純なlsは10秒間でも構いません。

ldd出力はLD_LIBRARY_PATH変更の前後でまったく同じであると私はstraceと遅いlsの実行をデバッグしようとした:私はどちらの場合もまったく同じ実行を取得します。 lsの実行中に実行が停止することはありません(straceは10秒遅れの間に何も出力せず、突然完全にlsを実行するため)。だから私はそれが私のシェルから来るかもしれないと思ったが、これは同じである。同じことだ、私のbashにstraceを実行して、lsを実行すると、同じstraceという出力が出る。シェルはlsを実行し、遅れの前の出力stracewaitpid(...)です)。だから私はlsの起動とそれがカーネルレベルの問題のようにその実行の間に何か間違ったことが起こったと思います。 ls(0CPU使用)にsleepが作成された場合のように機能します。ラグの間に

、私のCPUとネットワークアクティビティが完全に正常である...それは私の中にlsを乱さないように、新しいLDパスのライブラリは、任意の「標準ライブラリ」と競合しないことを

注意例。

私はLD_LIBRARY_PATH副作用や深く私の例をデバッグする方法についての深い説明に興味があります。

+0

良い質問。私は 'LD_LIBRARY_PATH'を使いましたが、そのような振る舞いは見たことがありませんでしたが、あなたの観察は孤立しているようです。面白い。 – thb

+7

'export LD_DEBUG = all'と' man 8 ld.so' –

+0

が明白ですが、lddがLD_LIBRARY_PATHから何かを使用している場合には、 "ldd $(which ls)"が手がかりを与えるかもしれません。 – Matthias

答えて

0

あなたが追加しようとしているライブラリまたはあなたが実行しようとしているライブラリの他に何があるのか​​分かりませんが、余分なものを必要とするプログラムのためだけにLD_LIBRARY_PATHを変更するラッパースクリプトを書く方が良いでしょうライブラリのように、lsのようなシステム機能は影響を受けません。

#!/bin/bash 
export LD_LIBRARY_PATH=/my_path/lib 
program_name 
ファイルを作成し

+1

はい、私はあなたに同意しますが、私は既存のビルドシステムの犠牲者です... –

1

この投稿chmod +x wrapper_nameは古い終了しているので、あなたはすでに解決策を見つけた場合、私は知りません。とにかく、これが助けになるかどうかはわかりませんが、現代のGNU/Linuxシステムでは、はLD_LIBRARY_PATHの使用が非推奨になりました。と推奨されていません。

そこで私は提案のカップルを持っている:

  1. あなたがそれを継続して使用する場合は、事前に保留中の代わりに、LD_LIBRARY_PATHにライブラリのパスを追加することによって、最初に試します。これは、以前のライブラリディレクトリのパスをスキャンするのに時間がかかる場合に役立ちます。

  2. 最新ののLDCONFIGシステムを使用してください。現在、LDディレクトリを使用しています。ライブラリへのパスを/etc/ld.so.confファイルに追加するか、/etc/ld.so.confにファイルを追加するだけです。d /にはあなたのライブラリへのパスが含まれています(インクルードディレクティブが/etc/ld.so.confにある場合はソースとなりますが、これは通常デフォルトの場合です)。次に、sudo ldconfigを実行して、システムLD検索パスを更新します。

このヘルプが欲しいです。乾杯。