it-swarm-ko.tech

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

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

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

a.out에게 찾아 보려면 어떻게해야합니까?

120
rahmu

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

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

  • LD_LIBRARY_PATH 환경 변수 (OSX의 경우 DYLD_LIBRARY_PATH)에 나열된 디렉토리;
  • 실행 파일에 나열된 디렉토리 rpath ;
  • 시스템 검색 경로의 디렉토리 (적어도 Linux에서는)는 /etc/ld.so.conf/lib/usr/lib의 항목으로 구성됩니다.

Rpath는 실행 파일에 저장됩니다 (DT_RPATH 또는 DT_RUNPATH 동적 속성). 실행 파일의 위치와 관련된 경로를 나타 내기 위해 $Origin로 시작하는 절대 경로 또는 경로를 포함 할 수 있습니다 (예 : 실행 파일이 /opt/myapp/bin에 있고 해당 rpath가 $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를 사용해보십시오.

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.
16
enzotib

여기에 대한 답변은 ldconfig입니다.

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

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

3
Sean C.

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

어디 1234는 실행중인 실행 파일의 pid입니다.

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

0
user138692