
어제 Ubuntu Linux 16.04에서 이 C++ 프로그램을 테스트했습니다. 나를 괴롭히는 것은 다음 프로그램이 Ubuntu 16.04 /var/log/syslog 파일에서 볼 수 있는 프로그래밍 방식으로 모노 서비스를 시작하지만 LD_LIBRARY_PATH
envp 포인터를 전달하더라도 C# 실행 파일의 런타임 환경에 전달하지 못한다는 사실입니다. 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
추가 자료: