이것은 내가 사용할 때 알아차린 특이성을 다루고 있기 때문에 중복된 것이 아닙니다 /etc/ld.so.conf
.
동적 링커가 라이브러리를 검색하는 경로를 얻으려면 명령을 실행합니다 ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"
. 언제 /etc/ld.so.conf
경로가 나열되지 않습니다. 이전 명령의 출력은 다음과 같습니다.
/lib
/usr/lib
나는 그것이 /lib
먼저 검색한 다음 검색한다고 생각했습니다 /usr/lib
. 와 같은 새 경로를 추가한 다음 remake 를 추가하면 의 /usr/local/lib
출력 /etc/ld.so.conf
은 /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
.