2009-05-19 7 views

答えて

6

私はいつもLD_LIBRARY_PATHを設定しましたが、問題は一度もありませんでした。私は、LD_LIBRARY_PATHを設定する必要があります場合は

はあなたの最初のリンクを引用するには?短い答えは決して決してありません。どうして? 一部のユーザーは、他のユーザーからの悪いアドバイスや修正方法がわからないひどくリンクされたコードのために、この環境変数を設定しているようです。私は決定的な問題文を呼んませある

。実際にはI don't like itを思い出します。 [YouTube、しかしSFW]。二ブログエントリ(http://blogs.oracle.com/ali/entry/avoiding_ld_library_path_the)がはるかに迫ったように見える問題...の性質であることを


は、一言で言えば、ライブラリのバージョンはThisProgramがFoo1.2を必要と衝突するが、ThatProgramはFOO1が必要です。 3、両方のプログラムを(簡単に)実行することはできません。これらの問題のほとんどは、実行中のシェルだけのLD_LIBRARY_PATHを設定する単純なラッパースクリプトによって否定されます。ほとんどの場合、対話シェルの独立した子プロセスです。

代替案については、ポストで詳しく説明しています。

明らかにあなたの質問に答える記事へのリンクを含む質問を投稿する理由は混乱しています...これらの記事のいずれかでカバーされていない特定の質問がありますか?

6

答えはあなたが引用した最初の記事です。

UNIXでは、ライブラリの場所は、コンパイラに対して-L dirオプションを使用して指定できます。 .... -Lおよび-Rオプションを使用する代わりに、コードをコンパイルする前に環境変数LD_RUN_PATHを設定することができます。

+1

@Scoob:LD_RUN_PATHは、ランタイム環境のforknowledgeを想定しています...同じマシンでビルドして実行している場合は問題ありませんが、ELFの場合は避けてください。私はLD_RUN_PATHを指定することでどのように傷つけることができないのか分かりませんが、それは役に立たないかもしれません; -0 – corlettk

11

あなたは追加してみることができます。

-Wl,-rpath,path/to/lib 

をリンカオプションに。これにより、環境変数LD_LIBRARY_PATHを気にする必要がなくなり、のコンパイル時にに特定のライブラリを指定することができます。バイナリからの相対パスの場合

、あなたが$ ORIGINを使用することができるが、例えば

-Wl,-rpath,'$ORIGIN/../lib' 

(静的LDと共有ライブラリにリンクするときの$ ORIGINが動作しない場合があり、-Wlを使用し、 - 許可-shlibの

+0

はい、LD_LIBRARY_PATHには何も間違っていません。実行している開発者にとっては、大丈夫です。あなたは、使用を必要とする、または使用を前提とした製品を出荷することは望ましくありません。代わりに、上記のことを行います(実際にライブラリがどこにあるのかを実際に知っていると仮定して)。共有ライブラリをロードする顧客保証の方法は、dlopen()を介して考えられるすべての場所と負荷を検索することです。 – EdH

+0

おそらく '--enable-new-dtags'を設定したいと思っています。 '-Wl、 - enable-new-dtags、-rpath、 '$ ORIGIN /../ lib'' –

1

)この問題を解決するために-undefined私は、既存の答えは実際に簡単な方法で質問に答えるかすることを見つける:

  1. LD_RUN_PATHは、リンカで使用されている(を参照してください)を参照してください。これは、コマンドラインに-rpath ...がない場合にのみ使用されます(gccコマンドラインの-Wl,rpath ...)。その変数に定義されているパスは、ELFバイナリファイルのRPATHエントリに追加されます。 (あなたはそれが私の開発バイナリに表示されます!それはそこではないがあるobjdump -x binary-filename -inほとんどのケースを使用してそのRPATHを見ることができますが、最終版がRPATHをインストールします一度削除されます。)

  2. LD_LIBRARY_PATHは、実行時に使用され、ときにダイナミックリンカ(lddを参照)がライブラリを検索する必要があるディレクトリを指定します。間違ったパスを指定すると、間違ったライブラリがロードされる可能性があります。これは

LD_RUN_PATH(1のように)あなたのバイナリで定義されているRPATH値に加えて使用され、あなたがプログラマであり、それを使用する方法がわからない場合を除き、実際にはセキュリティ上の脅威が発生しません。 CMakeを使って私のソフトウェアを構築しているので、いつも-rpathが使われています。そうすれば、ソフトウェアを実行するためにすべてをインストールする必要はありません。 lddはすべての.soファイルを自動的に見つけることができます。 (automake環境もそうするはずだったが、比較してもそれほど良くはなかった)

LD_LIBRARY_PATHはランタイム変数であり、したがって注意する必要があります。それは、私たちがその特別な機能を持っていないと、多くの共有オブジェクトが対処するのが本当に難しいと言われています。セキュリティ上の脅威かどうかは、おそらくそうではありません。ハッカーがコンピュータを持ちこたえた場合、そのハッカーはLD_LIBRARY_PATHにアクセスできます。何が起こるかは、その変数に間違ったパスを使用すると、バイナリがロードされないことがありますが、ロードすると、クラッシュするバイナリ、または少なくともバイナリが正しく動作しなくなる可能性があります。 1つの懸念は、時間がたつにつれてライブラリの新しいバージョンを取得し、LD_LIBRARY_PATHを削除することを忘れてしまう可能性があります。つまり、安全でないバージョンのライブラリを使用している可能性があります。

セキュリティのもう一つの可能​​性は、バイナリが検索しているものと同じ名前の偽のライブラリをインストールした場合、同じ機能をすべて含むライブラリですが、それらの機能の一部が非正常なコードに置き換えられている場合です。彼はLD_LIBRARY_PATH変数を変更して、そのライブラリをロードすることができます。その後、最終的にハッカーによって実行されます。ハッカーがあなたのシステムにそのようなライブラリを追加できるのであれば、彼はすでに入っていて、おそらく最初の場所でそれを行う必要はないでしょう(とにかく、彼はあなたのシステムを完全に制御しているからです)。あなたのUnixボックスが全体的に安全でない限り、ハッカーは自分のアカウントにライブラリを置くことしかできません。もしあなたの/usr/lib/...ライブラリの1つをハッカーが置き換えることができれば、彼はすでにあなたのシステムに完全にアクセスできます。だからLD_LIBRARY_PATHは必要ありません。

関連する問題