2017-10-08 14 views
0

私は現在CのユーザランドELFファイルローダで作業中ですLD_LIBRARY_PATHは設定されていないようです私のシステムではデフォルトで(x86_64 openSUSE)。ライブラリが格納されているすべてのディレクトリを取得する最善の方法は何ですか?パスは/etc/ld.so.confから取らよりC言語のlinux環境下でELF共有ライブラリを探す最良の方法は何ですか

64ビットバイナリまたは /usr/libと32ビットバイナリの /libため
+3

'man ldconfig'に必要なすべての回答があります – myaut

+0

なぜユーザランドELFファイルローダが必要ですか?あなたの質問は短すぎるし、モチベーションと文脈が欠けている。 **あなたの質問を**改善するために編集してください。 –

答えて

1

/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用であり、他のディストリビューションは異なるパスを使用する可能性があることに注意してください。

+0

他のディストリビューションは、共有ライブラリを保存するために異なるディレクトリを使うことができますが、メカニズムは同じです...それらのディレクトリは '/ etc/ld.so.conf'にリストされています。 –

1

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ユーザーと同じです。

ところでEDIT 1

に、あなたはそれがほとんどの地域で使用される方法であるとして、およそdlopen(3)や友人の機能を読んで、(これはおそらく、あなたが必要なもの可能性がある)オンデマンドで共有ライブラリをロードする必要がある場合メインプログラムのコンパイル前に聞いたことのないモジュールを動的にロードするためのプログラム。モジュールをロードし、必要なシンボル(dlsym(3)またはdlfunc(3))がモジュールによって与えられた参照を格納し、最後にそれらを呼び出す必要があります。

関連する問題