動的ローダー:奇妙な動作(Debian 8)

動的ローダー:奇妙な動作(Debian 8)

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/*.confldconfig/etc/ld.so.cacheldconfig

新しいプログラムがロードされるたびに、動的ローダはこのキャッシュを使用して必要なライブラリ検索を高速化します。

システムライブラリディレクトリからシンボリックリンクを手動で追加または削除する場合、変更を適用するにはldconfigシステムのルートとして実行してキャッシュをフラッシュする必要がある可能性があります。このコマンドを実行しないと、ダイナミックローダはライブラリパスが変更されたことを知らず、古いキャッシュのライブラリパスを引き続き使用します。

LD_LIBRARY_PATH上記は基本的にライブラリを見つけるための基本的なメカニズムですが、(= "このライブラリディレクトリを最初に確認してください")またはLD_PRELOAD(= "を使用して実行できます。いつもこのライブラリを最初にロードしてください)環境変数。

DT_RPATH(廃止予定)またはというセクション属性を使用して、プログラムバイナリ自体にライブラリパス情報を含めることもできますDT_RUNPATH。これもキャッシュメカニズムを無視しますが、私が知っている限り、その使用はやや珍しいです。正確にこれは、もはや同じではないシステム/環境で動作するためにプログラムが必要なときに元の問題と同じ問題を引き起こす傾向があるためです。精密プログラムが意図したシステムと一致します。

おすすめ記事