나는 어제 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
추가 자료: