DLLImport の共有オブジェクト (so) が実行時に共有オブジェクトを検索するソース コードを使用する Ubuntu Linux 16.04 Lenovo Thinkstation デスクトップで実行されている C# 実行ファイルはどこで共有オブジェクトを検索するのでしょうか。共有オブジェクト libxyz.so が C# 実行ファイルのサブディレクトリと同じサブディレクトリに存在する場合でも、C# 実行プログラムが正しく動作するように LD_LIBRARY_PATH をエクスポートする必要があることがわかりました。なぜでしょうか。
多くのサードパーティ Linux ソフトウェア製品のインストール中に、インストール プログラムまたはスクリプトが、そのサブディレクトリを含む LD_LIBRARY_PATH を顧客に指定させることなく、サブディレクトリ /usr/libx86_64-linux-gnu で libc.so.6 を見つけることができることに気付きました。なぜでしょうか?
また、C# 実行ファイルをポイント アンド クリック モノサービスとして実行する場合、Ubuntu Linux 16.04 ターミナルを開かずに、コンピューターが再起動するまで LD_LIBRARY_PATH をグローバルに指定するにはどうすればよいでしょうか。LD_LIBRARY_PATH を envp 引数として execle に渡すよりもエレガントな方法はありますか。
答え1
この質問の3つの部分すべてに答えてみます
C#実行可能プログラムが正しく動作するようにLD_LIBRARY_PATHをエクスポートする必要があるのはなぜですか?
インストールプログラムまたはスクリプトは、顧客がLD_LIBRARY_PATHを指定する必要なく、サブディレクトリ/usr/libx86_64-linux-gnuでlibc.so.6を見つけることができます。
リンクされたライブラリは、既知の場所のセットから参照されます。通常、これらはシステム ディレクトリであるため、特権コードが安全に使用できます (ユーザーによって上書きすることはできません)。
これを理解すると、既知の場所のセットに を含めることができないことが分かります.
。テキスト ファイル を調べると、既知の場所のセットを確認できます。これを編集する場合は、 を実行して対応するバイナリ データベースを更新する/etc/ld.so.conf
必要があります。ldconfig
既知の場所のセットは、 のインスタンスを使用することでアプリケーションごとに拡張できます。は、検索するディレクトリのコロンで区切られたリストを受け取ります。 ただし、これを使用すると、カーネルはプログラムからすべての権限を破棄します。 そのため、たとえば、チートやLD_LIBRARY_PATH
に使用することはできません。passwd
sudo
コンピュータが再起動するまで、LD_LIBRARY_PATH をグローバルに指定するにはどうすればよいでしょうか [...] LD_LIBRARY_PATH を envp 引数として execle に渡すよりもエレガントな方法はありますか?
sudo
これをグローバルに設定すると、、、passwd
その他の特権プログラムが機能しなくなるため、非常に悪い考えです。LD_LIBRARY_PATH
ただし、アプリケーションごとにシェル スクリプトで設定できない理由がわかりません。ターミナルに重要な内容を書き込むことはないため、「ターミナル プログラム」として起動する必要はありません。
#!/bin/bash
#
APP_DIR=/path/to/application
APP_DIR_LIB="$APP_DIR/lib"
APP_DIR_EXE="$APP_DIR/someprogram.exe"
export LD_LIBRARY_PATH="$APP_LIB_DIR"${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
exec "$APP_DIR_EXE" "$@"
echo "Ooops" >&2
exit 1
"$@"
スクリプトに渡される引数が実行可能ファイル自体に適用されるように使用しました。
モノラル サービスを開始または停止する方法がわからないため、その詳細についてはサポートできません。質問を更新していただければ、ここに追加できるものがあるかどうか確認します。