システム変数を検索する代わりに、プログラムが使用する必要があるライブラリへのパスを指定できますか?
答え1
ここにはいくつかのオプションがあります。最も一般的なもの
LD_LIBRARY_PATH=/custom/path:$LD_LIBRARY_PATH ./yourprogram
第二に、少し強力です。
LD_PRELOAD=/custom/path/lib.so ./yourprogram
1つ目は、検索リストにパスを最初に入力することです。 2番目は、他のライブラリをロードする前にライブラリをロードします。デフォルトの検索パスを完全に削除することはありません。動的にロードされたすべてのライブラリを交換したくない場合は問題ありません。
独自のプログラムをコンパイルする場合は、より多くのオプションがあります。静的にリンクするか(.a
ライブラリの全部または一部のみ)、ランタイム検索パスを設定できます。これを行うためのオプションは、コンパイラによって異なる場合があります。
コメントを追加:
空のパスを追加することが心配な場合は、LD_LIBRARY_PATH
次のものを使用できます。
LD_LIBRARY_PATH=/custom_path${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} ./myprogram
ワンタイムコマンドの場合は少し複雑ですが、全体的にはより安全です。この点を指摘したStephen Kittに感謝します。
答え2
ライブラリをプリロードすると、動的リンカは他のライブラリを見つける前にそのライブラリを使用してシンボルをバインドします。
LD_PRELOAD=/path/to/library.so program
次の方法で事前に確認できますldd
。
LD_PRELOAD=/path/to/library.so ldd program
成功すると、/path/to/library.so
要求されたシステムライブラリの代わりに出力が表示されますprogram
。