Linux의 동적 링커 검색 경로의 순서는 무엇입니까?

Linux의 동적 링커 검색 경로의 순서는 무엇입니까?

이것은 내가 그것을 사용하는 동안 알아차린 기능을 다루고 있기 때문에 중복된 것이 아닙니다 /etc/ld.so.conf.

동적 링커가 라이브러리를 검색하는 경로를 얻으려면 명령을 실행합니다 ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". /etc/ld.so.conf거기에 경로가 나열되어 있지 않은 경우 . 이전 명령의 출력은 다음과 같습니다.

/lib
/usr/lib

/lib먼저 검색한 다음 검색 하는 것 같아요 /usr/lib. 새 경로를 추가하면(예: /usr/local/libto /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/sbinPATH

ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"나열된 경로를 아래에서 위로 검색 하더라도 다른 디렉터리는 신뢰할 수 있는 디렉터리 /lib이후 가 아니라 신뢰할 수 있는 디렉터리 이후에 검색되기 때문에 여전히 순서가 왜곡되어 있습니다 /usr/lib.

ld.so그렇다면 라이브러리 경로가 검색되는 순서는 무엇입니까? /lib이전에 검색된 이유는 무엇 입니까 /usr/lib? 그렇지 않다면 나중에 다른 디렉토리를 검색하려는 이유는 무엇입니까 /lib?

답변1

이 시퀀스는 동적 링커의 매뉴얼에 문서화되어 있습니다.ld.so. 이것은:

  1. 의 목차 LD_LIBRARY_PATH;
  2. 의 목차 /etc/ld.so.conf;
  3. /lib;
  4. /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 프로그램 또는 을 통해 )을 실행할 때 중요합니다. 이 경우 일어나는 일은 그것이 비워진다는 것입니다.PATHLD_PRELOADsudoLD_LIBRARY_PATH

/libvs 의 경우에는 /usr/lib중요하지 않습니다. 동일한 엔터티(운영 체제)에 의해 제공되며 두 가지 모두에 라이브러리가 있어서는 안 됩니다. /lib(아주 약간의) 성능상의 이점을 제공하기 때문에 먼저 나열하는 것이 합리적입니다. 가장 일반적으로 사용되는 라이브러리, 특히 작은 기본 프로그램(로딩 시간이 대규모 장기 실행 프로그램보다 총 실행 시간의 비율이 더 높음)에 사용됩니다. 사용된 라이브러리는 에 있습니다 /lib.

관련 정보