LD_LIBRARY_PATH 환경 변수가 대상 C# 실행 파일의 런타임 환경에서 인식되지 않습니다.

LD_LIBRARY_PATH 환경 변수가 대상 C# 실행 파일의 런타임 환경에서 인식되지 않습니다.

나는 어제 Ubuntu Linux 16.04에서 이 C++ 프로그램을 테스트했습니다. 나를 괴롭히는 것은 다음 프로그램이 프로그래밍 방식으로 단일 서비스를 시작한다는 것입니다. Ubuntu 16.04 /var/log/syslog 파일에서 볼 수 있지만 C# 실행 파일의 런타임 환경에 전달할 수 없습니다. LD_LIBRARY_PATHThe 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

그리고 "공개" 통화를 찾으세요.

원칙적으로 lddLinux의 모든 공유 실행 파일에서 실행할 수 있습니다.

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

추가 자료:

관련 정보