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

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

어제 Ubuntu Linux 16.04에서 이 C++ 프로그램을 테스트했습니다. 나를 괴롭히는 것은 다음 프로그램이 Ubuntu 16.04 /var/log/syslog 파일에서 볼 수 있는 프로그래밍 방식으로 모노 서비스를 시작하지만 LD_LIBRARY_PATHenvp 포인터를 전달하더라도 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

"공개" 통화를 찾으세요.

원칙적으로 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

추가 자료:

관련 정보