![実行時にソースコードを見つけるためにDLLImportの共有オブジェクトを使用するUbuntu Linux 16.04デスクトップで実行されるC#実行可能ファイルはどこにありますか? [閉鎖]](https://linux33.com/image/88707/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E3%81%9F%E3%82%81%E3%81%ABDLLImport%E3%81%AE%E5%85%B1%E6%9C%89%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8BUbuntu%20Linux%2016.04%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8BC%EF%BC%83%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E3%81%A9%E3%81%93%E3%81%AB%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
実行時に共有オブジェクトのソースコードを見つけるためにDLLImportの共有オブジェクト(so)を使用するUbuntu Linux 16.04 Lenovo Thinkstationデスクトップで実行されるC#実行可能ファイルはどこにありますか?共有オブジェクトlibxyz.soがC#実行可能ファイルと同じサブディレクトリにある場合でも、正しいC#実行可能ファイルの動作を保証するためにLD_LIBRARY_PATHをエクスポートする必要があることに気付きました。なぜですか?
サードパーティのLinuxソフトウェア製品の多くをインストールしている間、インストーラまたはスクリプトは、顧客が次のディレクトリを指定しなくても、サブディレクトリ/usr/libx86_64-linux-gnuにlibc.so.6を見つけることができることを確認しました。このサブディレクトリ。なぜこれが起こるのですか?
また、ワンクリックでC#実行可能ファイルを単一のサービスとして実行するには、Ubuntu Linux 16.04端末を開かずにコンピュータが再起動されるまでLD_LIBRARY_PATHをグローバルに指定できますか? LD_LIBRARY_PATHを実行にenvpパラメータとして渡すよりもエレガントな方法はありますか?
答え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
"$@"
私はスクリプトに渡されたすべての引数が実行可能ファイル自体に適用されるようにそれを使用しました。
単一のサービスを開始または停止する方法がわからないため、具体的な事項についてはお手伝いできません。質問を更新したら、ここに追加できることを確認します。