Debian 8ゲストオペレーティングシステム(OpenVZコンテナ化された環境)で科学アプリケーションを設定して実行しようとしています。オペレーティングシステムにバンドルされているGNU C ++ライブラリはかなり古く、必要なシンボルがすべて含まれていないため、最新バージョンのライブラリを含む特別なディレクトリを作成し、そのディレクトリを指すようにlibstdc++.so.6
環境変数を設定しました。LD_LIBRARY_PATH
また、ターゲットアプリケーションにSUID権限が設定されていないことを確認しました(LD_LIBRARY_PATH
一部のプラットフォームでは無視される可能性があります)。それにもかかわらず、ldd <APP_EXECUTABLE>
コマンドは依然としてデフォルトのシステム位置を使用しているとマークされています/usr/lib/x86_64-linux-gnu
。なぜLD_LIBRARY_PATH
無視されますか?
PS:環境変数を試してみましたが、LD_PRELOAD
やはり無視されました。
答え1
/lib
このコマンドは、標準のシステムライブラリディレクトリ(通常はおよび/usr/lib
)と、ファイルおよび/またはファイルで定義されているすべてのディレクトリの内容を確認し、/etc/ld.so.conf
結果をにキャッシュします。パッケージ管理ツールは通常、ライブラリパッケージをインストールまたは削除するたびにこのタスクを自動的に実行します。/etc/ld.so.conf.d/*.conf
ldconfig
/etc/ld.so.cache
ldconfig
新しいプログラムがロードされるたびに、動的ローダはこのキャッシュを使用して必要なライブラリ検索を高速化します。
システムライブラリディレクトリからシンボリックリンクを手動で追加または削除する場合、変更を適用するにはldconfig
システムのルートとして実行してキャッシュをフラッシュする必要がある可能性があります。このコマンドを実行しないと、ダイナミックローダはライブラリパスが変更されたことを知らず、古いキャッシュのライブラリパスを引き続き使用します。
LD_LIBRARY_PATH
上記は基本的にライブラリを見つけるための基本的なメカニズムですが、(= "このライブラリディレクトリを最初に確認してください")またはLD_PRELOAD
(= "を使用して実行できます。いつもこのライブラリを最初にロードしてください)環境変数。
DT_RPATH
(廃止予定)またはというセクション属性を使用して、プログラムバイナリ自体にライブラリパス情報を含めることもできますDT_RUNPATH
。これもキャッシュメカニズムを無視しますが、私が知っている限り、その使用はやや珍しいです。正確にこれは、もはや同じではないシステム/環境で動作するためにプログラムが必要なときに元の問題と同じ問題を引き起こす傾向があるためです。精密プログラムが意図したシステムと一致します。