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


13

이것은 내가 사용했을 때 발견 한 특이점을 다루고 있기 때문에 이것은 중복되지 않습니다 /etc/ld.so.conf.

동적 링커가 라이브러리를 검색하는 경로를 얻으려면 명령을 실행하십시오 ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". 때 /etc/ld.so.conf그 안에 나열된 경로가 없습니다. 이전 명령의 출력은

/lib
/usr/lib

나는 검색 것을 생각 /lib먼저하고 /usr/lib. I와 같은 새로운 경로를 추가하는 경우 /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됩니까?

답변:


16

순서는 다이내믹 링커의 설명서에서 설명된다 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또는 요소 /etc/ld.so.conf들은 반드시 더 직접적인 경로가 같은 값을 주입으로, 임의의 코드를 실행하기 PATH때문에,LD_PRELOAD라이브러리로드 경로의 신뢰는 실행이 신뢰 경계를 초과 할 때, 즉 추가 권한으로 프로그램을 실행할 때 (예 : setuid / setgid 프로그램 또는를 통해 sudo) 중요 합니다. 이 경우 발생하는 LD_LIBRARY_PATH것은 비워진 것입니다.

에 관해서는 /lib/usr/lib, 그것은별로 중요하지 않습니다 : 그들은 같은 엔티티 (운영 체제)에서 제공하고 두 존재의 라이브러리가 안된다. /lib가장 많이 사용되는 라이브러리, 특히 작은 기본 프로그램에서 사용하는 라이브러리 (로드 시간이 크고 긴 것보다 총 실행 시간의 비율보다 높음)와 같이 (매우 작은) 성능 이점을 제공하므로 먼저 목록을 작성하는 것이 좋습니다 . -running program)에 있습니다 /lib.


LD_LIBRARY_PATH에 여러 디렉토리가 나열되면 어떤 순서로 검색합니까?
argentum2f

@ argentum2f 왼쪽에서 오른쪽으로와 동일합니다 PATH.
Gilles 'SO- 악마 그만
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.