런타임에 소스 코드를 찾기 위해 DLLImport의 공유 개체를 사용하는 Ubuntu Linux 16.04 데스크탑에서 실행되는 C# 실행 파일은 어디에 있습니까? [폐쇄]

런타임에 소스 코드를 찾기 위해 DLLImport의 공유 개체를 사용하는 Ubuntu Linux 16.04 데스크탑에서 실행되는 C# 실행 파일은 어디에 있습니까? [폐쇄]

런타임 시 공유 개체의 소스 코드를 찾기 위해 DLLImport의 공유 개체(so's)를 사용하는 Ubuntu Linux 16.04 Lenovo Thinkstation 데스크탑에서 실행되는 C# 실행 파일은 어디에 있습니까? 공유 개체 libxyz.so가 C# 실행 파일과 동일한 하위 디렉터리에 있더라도 올바른 C# 실행 파일 동작을 보장하려면 LD_LIBRARY_PATH를 내보내야 한다는 것을 알았습니다. 왜 그럴까요?

많은 타사 Linux 소프트웨어 제품을 설치하는 동안 설치 프로그램이나 스크립트는 고객이 다음이 포함된 디렉터리를 지정하지 않아도 하위 디렉터리 /usr/libx86_64-linux-gnu에서 libc.so.6을 찾을 수 있다는 사실을 확인했습니다. 이 하위 디렉토리. 왜 이런 일이 발생합니까?

또한 클릭 한 번으로 C# 실행 파일을 단일 서비스로 실행하려면 Ubuntu Linux 16.04 터미널을 열지 않고 컴퓨터가 재부팅될 때까지 어떻게 LD_LIBRARY_PATH를 전역적으로 지정할 수 있습니까? LD_LIBRARY_PATH를 실행에 envp 매개변수로 전달하는 것보다 더 우아한 방법이 있습니까?

답변1

나는 당신을 위해 이 질문의 세 부분 모두에 대답하려고 노력할 것입니다

[이유] 올바른 C# 실행 프로그램 동작을 보장하려면 LD_LIBRARY_PATH를 내보내야 합니다.

설치 프로그램 또는 스크립트는 고객이 LD_LIBRARY_PATH를 지정하지 않고도 /usr/libx86_64-linux-gnu 하위 디렉터리에서 libc.so.6을 찾습니다.

연결된 라이브러리는 알려진 위치 집합에서 참조됩니다. 일반적으로 이는 권한 있는 코드로 안전하게 사용할 수 있는 시스템 디렉터리입니다(사용자가 덮어쓸 수 없음).

이것을 이해하면 알려진 위치 집합에 가 포함될 수밖에 없다는 것을 깨닫게 될 것입니다 .. 텍스트 파일을 검사하여 알려진 위치 집합을 볼 수 있습니다 /etc/ld.so.conf. 이를 편집하는 경우 ldconfig해당 바이너리 데이터베이스를 업데이트하기 위해 실행해야 합니다.

각 애플리케이션의 알려진 위치 집합은 LD_LIBRARY_PATH검색할 디렉터리 목록을 콜론으로 구분하는 인스턴스를 사용하여 확장할 수 있습니다. 이것을 사용하면 커널은 프로그램에 대한 모든 권한을 포기하므로 ​​예 passwd를 들어 속임수를 쓰는 데 사용할 수 없습니다 sudo.

컴퓨터가 다시 시작될 때까지 LD_LIBRARY_PATH를 전역적으로 어떻게 지정할 수 있습니까? [...] LD_LIBRARY_PATH를 envp 매개변수로 execle에 전달하는 것보다 더 우아한 방법이 있습니까?

sudo이것을 전역적으로 설정하는 것은 , passwd및 기타 권한 있는 프로그램을 손상시키므로 매우 나쁜 생각입니다 . 그러나 왜 LD_LIBRARY_PATH애플리케이션별 셸 스크립트에서 설정할 수 없는지 이해가 되지 않습니다 . 터미널에 중요한 내용을 쓰지 않으므로 "터미널 프로그램"으로 시작할 필요가 없습니다.

#!/bin/bash
#
APP_DIR=/path/to/application
APP_DIR_LIB="$APP_DIR/lib"
APP_DIR_EXE="$APP_DIR/someprogram.exe"

export LD_LIBRARY_PATH="$APP_LIB_DIR"${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
exec "$APP_DIR_EXE" "$@"

echo "Ooops" >&2
exit 1

"$@"나는 스크립트에 전달된 모든 인수가 실행 파일 자체에 적용되는 방식으로 이를 사용했습니다 .

단일 서비스를 시작하거나 중지하는 방법을 모르기 때문에 구체적인 사항에 대해 도움을 드릴 수 없습니다. 질문을 업데이트하면 여기에 추가할 수 있는지 확인하겠습니다.

관련 정보