실행 파일은 런타임에 공유 객체를 어디에서 찾습니까?


102

링크 / 컴파일시 공유 객체 포함을 정의하는 방법을 이해합니다. 그러나 여전히 실행 파일에서 실행 파일이 공유 객체 ( *.so라이브러리)를 어떻게 찾는 지 궁금합니다 .

예를 들어, 내 앱 a.out은 lib.so라이브러리에 정의 된 함수를 호출합니다 . 컴파일 후 lib.so내의 새 디렉토리 로 이동 합니다 $HOME.

a.out거기서 찾아 보라고 어떻게 할 수 있습니까?

답변:


102

공유 라이브러리 HOWTO는 관련된 메커니즘의 대부분을 설명하고, 동적 로더 설명서는 자세히로 들어갑니다. 각 유닉스 변형에는 고유 한 방식이 있지만 대부분 동일한 실행 형식 ( ELF )을 사용하며 유사한 동적 링커 (Solaris에서 파생)가 있습니다. 아래에서는 Linux에 중점을 둔 일반적인 동작을 요약합니다. 전체 스토리는 시스템 설명서를 확인하십시오.

간단히 말해, .so링커는 동적 라이브러리 ( 파일)를 찾을 때 다음을 시도합니다.

  • LD_LIBRARY_PATH환경 변수에 나열된 디렉토리 ( DYLD_LIBRARY_PATHOSX의 경우);
  • 실행 파일의 rpath에 나열된 디렉토리 ;
  • 시스템 검색 경로의 디렉토리 (최소 Linux의 경우)는 /etc/ld.so.confplus /lib및 의 항목으로 구성됩니다 /usr/lib.

rpath는 실행 파일에 저장됩니다 ( DT_RPATH또는 DT_RUNPATH동적 속성). 여기에는 $ORIGIN실행 파일의 위치에 상대적인 경로를 나타 내기 위해 시작하는 절대 경로 또는 경로가 포함될 수 있습니다 (예 : 실행 파일이 /opt/myapp/bin있고 해당 경로가 r $ORIGIN/../lib:$ORIGIN/../plugins인 경우 동적 링커가 /opt/myapp/lib와 를 찾습니다 /opt/myapp/plugins). rpath는 일반적으로 -rpath옵션을 사용하여 실행 파일을 컴파일 할 때 결정 ld되지만 나중에로 변경할 수 있습니다 chrpath.

시나리오에서는 응용 프로그램의 개발자 또는 패키저이라면, 설명하고 그것이 설치 될 수 있도록하고자 …/bin, …/lib구조, 다음으로 링크 -rpath='$ORIGIN/../lib'. 시스템에 사전 빌드 된 바이너리를 설치하는 경우 라이브러리를 검색 경로의 디렉토리 ( /usr/local/lib시스템 관리자 인 경우 추가하는 디렉토리 $LD_LIBRARY_PATH)에 놓거나을 시도하십시오 chrpath.


3
일부 시스템에서, /lib64그리고 /usr/lib6464 비트 바이너리 사용되며 /lib및 /usr/lib32 비트 바이너리 사용된다.
— Mark Lakata

왜하지 못했습니다 대답에 대해 아무것도 이야기 ldconfig를을 ??
— 확률을 좋아한다

1
@LovesProbability 문제는 실행 파일이 라이브러리를 찾는 위치에 관한 것이기 때문 ldconfig입니다. ldconfig라이브러리를 설치할 때 관여합니다.
— Gilles

1
*.so라이브러리 의 "시스템 검색 경로" 는와 동일 하지 않습니다$PATH . 검색 경로는 @enzotib의 답변입니다. 검색 할 경로를 인쇄하려면을 실행하십시오 ldconfig -v 2>/dev/null | grep -v ^$'\t'.
— 앤드류 베이트

나를 위해, ldconfig /sbin/ldconfig를 실행하려면 루트가 아닌 루트를 실행하기 위해 Andrew Bate의 다른 마술이 필요 했습니다
— Robert Lugg

16

Linux에서이 동작은 ld(1)매뉴얼 페이지에 명시되어 있습니다

       The linker uses the following search paths to locate required
       shared libraries:

       1.  Any directories specified by -rpath-link options.

       2.  Any directories specified by -rpath options.  The difference
           between -rpath and -rpath-link is that directories specified by
           -rpath options are included in the executable and used at
           runtime, whereas the -rpath-link option is only effective at
           link time. Searching -rpath in this way is only supported by
           native linkers and cross linkers which have been configured
           with the --with-sysroot option.

       3.  On an ELF system, for native linkers, if the -rpath and
           -rpath-link options were not used, search the contents of the
           environment variable "LD_RUN_PATH".

       4.  On SunOS, if the -rpath option was not used, search any
           directories specified using -L options.

       5.  For a native linker, the search the contents of the environment
           variable "LD_LIBRARY_PATH".

       6.  For a native ELF linker, the directories in "DT_RUNPATH" or
           "DT_RPATH" of a shared library are searched for shared
           libraries needed by it. The "DT_RPATH" entries are ignored if
           "DT_RUNPATH" entries exist.

       7.  The default directories, normally /lib and /usr/lib.

       8.  For a native linker on an ELF system, if the file
           /etc/ld.so.conf exists, the list of directories found in that
           file.

       If the required shared library is not found, the linker will issue
       a warning and continue with the link.

1
"기본 디렉토리, 보통 / lib 및 / usr / lib." -> 시스템이 정상인지 어떻게 알 수 있습니까?
— Thorsten Staerk

2
문제는 런타임에 관한 것이지 링크 시간이 아닙니다
— Talespin_Kit

2

나는 대답이 여기 있다고 확신합니다 ldconfig.

ldconfig는 명령 줄에 지정된 디렉토리, /etc/ld.so.conf 파일 및 신뢰할 수있는 디렉토리 (/ lib 및 / usr / lib)에있는 가장 최근의 공유 라이브러리에 필요한 링크와 캐시를 만듭니다. 캐시는 런타임 링커 ld.so 또는 ld-linux.so에서 사용합니다. ldconfig는 링크를 업데이트해야하는 버전을 결정할 때 발견되는 라이브러리의 헤더 및 파일 이름을 확인합니다.

http://linux.die.net/man/8/ldconfig


0

응용 프로그램을 실행하기 위해 파일 /proc/1234/maps에는 실제로 동적으로 연결된 모든 라이브러리가 포함됩니다.

1234실행중인 실행 파일의 pid는 어디에 있습니까 ?

Gilles가 지적한대로 Linux는 LD_LIBRARY_PATH 및 기타 변수를 따릅니다.


4
두 번째 문장에서 Gilles의 답변이 도움이된다는 것을 확인하는 것이 좋습니다. 그러나 첫 번째 부분은 파일이 어디에 있는지, 파일이 이미 발견 된 경우 어디에서 왔는지 알려주는 방법을 설명하는 데 전혀 기여하지 않습니다. 이 모든 것은 대답이 아닌 의견 일뿐입니다.
— Anthon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.