私は現在CのユーザランドELFファイルローダで作業中ですLD_LIBRARY_PATH
は設定されていないようです私のシステムではデフォルトで(x86_64 openSUSE)。ライブラリが格納されているすべてのディレクトリを取得する最善の方法は何ですか?パスは/etc/ld.so.conf
から取らよりC言語のlinux環境下でELF共有ライブラリを探す最良の方法は何ですか
/usr/lib
と32ビットバイナリの
/lib
ため
私は現在CのユーザランドELFファイルローダで作業中ですLD_LIBRARY_PATH
は設定されていないようです私のシステムではデフォルトで(x86_64 openSUSE)。ライブラリが格納されているすべてのディレクトリを取得する最善の方法は何ですか?パスは/etc/ld.so.conf
から取らよりC言語のlinux環境下でELF共有ライブラリを探す最良の方法は何ですか
/usr/lib
と32ビットバイナリの
/lib
ため
/usr/lib64
と/lib64
、及びコンフィグを含んman ldconfig
ldconfig
からはに必要なリンクおよびキャッシュを作成しますファイル
/etc/ld.so.conf
、および信頼できるディレクトリ/lib
および/usr/lib
のコマンドラインで指定されたディレクトリにある最新の共有ライブラリx86-64,/lib
および/usr/lib
などの一部の64ビットアーキテクチャでは、32ビットライブラリの信頼できるディレクトリであり、/lib64
および/usr/lib64
は64ビットライブラリに使用されます)。キャッシュは、実行時リンカーld.soまたはld-linux.soによって使用されます。ライブラリを検索するするディレクトリのリストを含む
...
は/etc/ld.so.confファイル、1行に1つずつ、。
この情報はopenSUSE用であり、他のディストリビューションは異なるパスを使用する可能性があることに注意してください。
他のディストリビューションは、共有ライブラリを保存するために異なるディレクトリを使うことができますが、メカニズムは同じです...それらのディレクトリは '/ etc/ld.so.conf'にリストされています。 –
LD_LIBRARY_PATH
は、共有ライブラリをインストールするためにシステムディレクトリにアクセスできない場合やアクセスできない場合に、ユーザーが独自のライブラリを追加してロードするために使用する標準環境変数です。
通常、ブート時にldconfig
によって読み込まれるファイル(それはライブラリの共有オブジェクトの読み込み時に使用するために迅速なアクセスにパスをハッシュテーブルを持つバイナリDBMsomewhatファイル/etc/ld.so.cache
を作成する/etc/ld.so.conf
を読み込み、それはで使用されているがありますダイナミックローダー(カーネルツールのようなものは1つしかないので、実行するディストリビューションに依存しませんが、使用しているカーネルバージョンではちょっと変わっていますが、カーネルほど大きくはありません---
soname sonameは、共有オブジェクトがインターフェイスを参照するために使用する一般的な名前であることを知ります。これは、共有オブジェクトwil lはちょうど
ldconfig -p
を実行して、ダイナミックローダによって使用されている)ライブラリと互換性があり、あなたはすべてのsonamesが登録され得るだろう、とライブラリへのパスは、実際にそのSONAMEのためにロードされました。
ldd your_executable
とこれは、システムで実行可能なニーズや場所は、彼らがしていることsonamesが印刷されます:あなたは、ダイナミックローダーによっていくつかの具体的な実行によってロードされるライブラリかを知りたい場合は
、ちょうどこれを実行します位置しています。
/etc/ld.so.conf
に含まれるすべてのディレクトリを共有オブジェクトファイルとして検索し、そのファイルに格納されているsonameと一致する名前をすべて探し、sonameという名前のファイルへの参照を含めます見つかりました。テーブルが完成すると、ファイル/etc/ld.so.cache
が作成され、ユーザモードを担当する共有モジュールである/lib64/ld-linux-x86-64.so.2
によって使用され、プログラムによって使用される残りの共有ライブラリがロードされます。
そこには問題はあなたがローカル共有ライブラリを開発しますが、そのディレクトリが正常に/etc/ld.so.conf
には含まれませんように、あなたがLD_LIBRARY_PATH=${HOME}/lib
を作成し、それををエクスポート注意する必要があります格納するローカル$HOME/lib
ディレクトリを持つでいない、とrootユーザーであるとして使用しないでください。env変数が無効になっているrootユーザーと同じです。
に、あなたはそれがほとんどの地域で使用される方法であるとして、およそdlopen(3)
や友人の機能を読んで、(これはおそらく、あなたが必要なもの可能性がある)オンデマンドで共有ライブラリをロードする必要がある場合メインプログラムのコンパイル前に聞いたことのないモジュールを動的にロードするためのプログラム。モジュールをロードし、必要なシンボル(dlsym(3)
またはdlfunc(3)
)がモジュールによって与えられた参照を格納し、最後にそれらを呼び出す必要があります。
'man ldconfig'に必要なすべての回答があります – myaut
なぜユーザランドELFファイルローダが必要ですか?あなたの質問は短すぎるし、モチベーションと文脈が欠けている。 **あなたの質問を**改善するために編集してください。 –