이것은 내가 그것을 사용하는 동안 알아차린 기능을 다루고 있기 때문에 중복된 것이 아닙니다 /etc/ld.so.conf
.
동적 링커가 라이브러리를 검색하는 경로를 얻으려면 명령을 실행합니다 ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"
. /etc/ld.so.conf
거기에 경로가 나열되어 있지 않은 경우 . 이전 명령의 출력은 다음과 같습니다.
/lib
/usr/lib
/lib
먼저 검색한 다음 검색 하는 것 같아요 /usr/lib
. 새 경로를 추가하면(예: /usr/local/lib
to /etc/ld.so.conf
및 remake) /etc/ld.so.cache
출력은 ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"
다음과 같습니다.
/usr/local/lib
/lib
/usr/lib
나열된 디렉토리에 대한 검색 순서가 위에서 아래로 올바르게 가정하면 다른 /lib
디렉토리가 및 이전에 검색되기 때문에 이것이 이상하다고 생각합니다 /usr/lib
. 신뢰할 수 있는 디렉터리 이전에 다른 디렉터리를 검색하는 것 자체는 이상한 일이 아니지만, /lib
이전에 검색할 때는 & 안에서 &를 검색 하기 /usr/lib
때문에 이상하다 ./bin
/sbin
/usr/bin
/usr/sbin
PATH
ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"
나열된 경로를 아래에서 위로 검색 하더라도 다른 디렉터리는 신뢰할 수 있는 디렉터리 /lib
이후 가 아니라 신뢰할 수 있는 디렉터리 이후에 검색되기 때문에 여전히 순서가 왜곡되어 있습니다 /usr/lib
.
ld.so
그렇다면 라이브러리 경로가 검색되는 순서는 무엇입니까? /lib
이전에 검색된 이유는 무엇 입니까 /usr/lib
? 그렇지 않다면 나중에 다른 디렉토리를 검색하려는 이유는 무엇입니까 /lib
?
답변1
이 시퀀스는 동적 링커의 매뉴얼에 문서화되어 있습니다.ld.so
. 이것은:
- 의 목차
LD_LIBRARY_PATH
; - 의 목차
/etc/ld.so.conf
; /lib
;/usr/lib
.
(약간 단순화했습니다. 자세한 내용은 설명서를 참조하세요.)
이 순서는 이것이 기본 위치의 라이브러리를 사용자 정의 라이브러리로 재정의하는 유일한 방법이라고 생각할 때 의미가 있습니다. LD_LIBRARY_PATH
다른 설정보다 우선해야 하는 사용자 설정입니다. /etc/ld.so.conf
운영 체제 기본값보다 앞에 있는 로컬 설정입니다. 따라서 사용자로서 다른 버전의 라이브러리로 프로그램을 실행하려는 경우 LD_LIBRARY_PATH
다른 라이브러리 버전이 포함된 위치에서 프로그램을 실행할 수 있습니다. 관리자로서 저는 다양한 버전의 라이브러리를 넣고 /usr/local/lib
나열 /usr/local/lib
할 수 있습니다 /etc/ld.so.conf
.
신뢰는 이것과 아무 관련이 없습니다. 이 검색 경로에 나열된 모든 디렉터리는 결국 해당 디렉터리에서 로드될 수 있으므로 신뢰할 수 있어야 합니다. 이론적으로는 "더 많은 신뢰가 필요한" 시스템의 모든 프로그램에서 사용하는 라이브러리 이름을 나열하고 모든 라이브러리가 "가장 신뢰할 수 있는" 디렉토리에 있는지 확인한 다음 "신뢰도가 낮은" 디렉토리는 나타나지 않습니다. 검색 경로에서 더 신뢰할 수 있는 디렉터리 뒤에 위치하는 경우 "신뢰가 덜 필요한" 프로그램을 제외하고 사용할 수 있습니다. 그러나 그것은 매우 취약할 것이다. 이는 또한 의미가 없습니다. 공격자가 의 값 LD_LIBRARY_PATH
이나 요소를 주입할 수 있는 경우 , of 등 의 값을 /etc/ld.so.conf
주입하는 등 임의 코드를 실행하는 보다 직접적인 경로가 있어야 합니다 . 라이브러리 로드 경로 신뢰는 실행이 신뢰 경계를 넘을 때, 즉 추가 권한이 있는 프로그램(예: setuid/setgid 프로그램 또는 을 통해 )을 실행할 때 중요합니다. 이 경우 일어나는 일은 그것이 비워진다는 것입니다.PATH
LD_PRELOAD
sudo
LD_LIBRARY_PATH
/lib
vs 의 경우에는 /usr/lib
중요하지 않습니다. 동일한 엔터티(운영 체제)에 의해 제공되며 두 가지 모두에 라이브러리가 있어서는 안 됩니다. /lib
(아주 약간의) 성능상의 이점을 제공하기 때문에 먼저 나열하는 것이 합리적입니다. 가장 일반적으로 사용되는 라이브러리, 특히 작은 기본 프로그램(로딩 시간이 대규모 장기 실행 프로그램보다 총 실행 시간의 비율이 더 높음)에 사용됩니다. 사용된 라이브러리는 에 있습니다 /lib
.