私は昨日、Ubuntu Linux 16.04でこのC ++プログラムをテストしました。私を悩ませるのは、次のプログラムがプログラムで単一のサービスを開始することです。 Ubuntu 16.04 /var/log/syslog ファイルで表示できますが、C# 実行可能ファイルのランタイム環境に渡すことはできません。LD_LIBRARY_PATH
The envpポインタが渡されます。execve
システムコール。LD_LIBRARY_PATH
ターゲット実行可能ファイルのランタイム環境が環境変数を認識しないことがわかる方法は、ターゲット実行可能ファイルが誤動作してランタイムライブラリの依存関係を見つける場所を知らせるすべてのLD_LIBRARY_PATH
機能をスキップすることです。
#include <unistd.h> // execv(), fork()
#include <sys/types.h> // pid_t
#include <sys/wait.h> // waitpid()
#include <stdio.h>
int main(int argc, char* argvp)
{
char *argv[] = { "/usr/lib/mono/4.5/mono-service.exe",
"Audio_Video_Recorder.exe", 0};
char *envp[] =
{
"LD_LIBRARY_PATH=.",
0
};
execve(argv[0], &argv[0], envp);
fprintf(stderr, "Oops!\n");
return -1;
}
C ++およびLinux APIを使用してプログラムでこれらの監督を変更できますか?
ベストアンサー1
Debian/Ubuntuに基づいているため、問題がrpathに起因する可能性はありません(まだ可能です)。問題に固執する可能性が高くなります
"LD_LIBRARY_PATH=."
絶対パス名を指定しません。
これを使用して、strace
実行可能ファイルが開こうとしているパスを表示できます。たとえば、次のようになります。
strace -f -o strace.log mono myprogram
そして「公開」通貨を探してください。
原則として、ldd
Linux上の任意の共有実行可能ファイルで実行できます。
ldd myprogram
または(おそらく)
ldd /usr/lib/mono/4.5/mono-service.exe
同様に、objdump は次のような有用な情報を提供します。
objdump -ax /usr/lib/mono/4.5/mono-service.exe
絶対パス名で解決される共有ライブラリがあることを確認してください。 obdumpは、出力の「ダイナミックライブラリ」セクションでこれを行う必要があります。
しかしコメントに.NET/Monoアプリケーション用のlddと同じたとえば、環境変数を設定して有用な情報を取得するには、より高いレベル(およびさまざまなツール)が必要になることを示します。
$ MONO_LOG_LEVEL=debug mono myprogram
追加資料: