![런타임에 소스 코드를 찾기 위해 DLLImport의 공유 개체를 사용하는 Ubuntu Linux 16.04 데스크탑에서 실행되는 C# 실행 파일은 어디에 있습니까? [폐쇄]](https://linux55.com/image/88707/%EB%9F%B0%ED%83%80%EC%9E%84%EC%97%90%20%EC%86%8C%EC%8A%A4%20%EC%BD%94%EB%93%9C%EB%A5%BC%20%EC%B0%BE%EA%B8%B0%20%EC%9C%84%ED%95%B4%20DLLImport%EC%9D%98%20%EA%B3%B5%EC%9C%A0%20%EA%B0%9C%EC%B2%B4%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20Ubuntu%20Linux%2016.04%20%EB%8D%B0%EC%8A%A4%ED%81%AC%ED%83%91%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%20C%23%20%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC%EC%9D%80%20%EC%96%B4%EB%94%94%EC%97%90%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
런타임 시 공유 개체의 소스 코드를 찾기 위해 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
"$@"
나는 스크립트에 전달된 모든 인수가 실행 파일 자체에 적용되는 방식으로 이를 사용했습니다 .
단일 서비스를 시작하거나 중지하는 방법을 모르기 때문에 구체적인 사항에 대해 도움을 드릴 수 없습니다. 질문을 업데이트하면 여기에 추가할 수 있는지 확인하겠습니다.