2010-08-03 5 views
0

제 리눅스 프로그램이 예정된 라이브러리에 연결되지 않는다고 생각하게 만드는 약간의 오류가 있습니다. 링크 된 모든 라이브러리에 대한 전체 경로는 어떻게 얻을 수 있습니까? 나는 ldd이 나에게 이름을 줄 것이라는 것을 안다. 그러나 어떻게 그것을 사용하여 전체 경로를 얻을 수 있을까?링크 된 라이브러리 추적

감사합니다.

답변

6

실제로 ldd은 응용 프로그램의 공유 라이브러리 종속성에서 찾을 수있는 파일 이름의 절대 경로를 제공합니다.

$ ldd v8test 
    linux-gate.so.1 => (0xb78b2000) 
    libz.so.1 => /usr/lib/libz.so.1 (0xb787e000) 
    librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7875000) 
    libcppunit-1.12.so.1 => /usr/lib/libcppunit-1.12.so.1 (0xb782c000) 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7604000) 
    libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb75dd000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb75bf000) 
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7478000) 
    libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb745f000) 
    libboost_system-mt.so.1.38.0 => /usr/lib/libboost_system-mt.so.1.38.0 (0xb745b000) 
    /lib/ld-linux.so.2 (0xb78b3000) 
    libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7456000) 
    libboost_thread-mt.so.1.38.0 => /usr/lib/libboost_thread-mt.so.1.38.0 (0xb7383000) 
    libboost_filesystem-mt.so.1.38.0 => /usr/lib/libboost_filesystem-mt.so.1.38.0 (0xb7370000) 
    libtinyxml.so.1 => /home/dmitry/tinyxml/libtinyxml.so.1 (0xb7359000) 
    libboost_regex-mt.so.1.38.0 => /usr/lib/libboost_regex-mt.so.1.38.0 (0xb728c000) 
    libmysqlclient_r.so.15 => /usr/lib/libmysqlclient_r.so.15 (0xb70a1000) 
    libicuuc.so.42 => /usr/lib/libicuuc.so.42 (0xb6f61000) 
    libicudata.so.42 => /usr/lib/libicudata.so.42 (0xb601a000) 
    libicui18n.so.42 => /usr/lib/libicui18n.so.42 (0xb5e6b000) 
    libcrypt.so.1 => /lib/i686/cmov/libcrypt.so.1 (0xb5e39000) 
    libnsl.so.1 => /lib/i686/cmov/libnsl.so.1 (0xb5e22000) 

라이브러리는 /etc/ld.so.conf, LD_LIBRARY_PATH 언급 또는 이진 자체 rpath 설정 경로에 해당 불리는 (예컨대 libboost_filesystem-mt.so.1.38.0)에 의해 검색된다.

ldd 뭔가를 찾을 수없는 경우이 경우

libicuuc.so.42 => not found 

올바른 검색 경로를 제공하기 위해 한 가지 방법 중 하나를 사용하는 것을 고려 것처럼 보일 것이다.

ldd은 어떤 이유로 인해 라이브러리를로드 할 수 없을 때 경고 메시지를 표시합니다.

$ ldd v8test 
./v8test: error while loading shared libraries: /home/dmitry/a/liba.so.2: invalid ELF header 

물론 라이브러리 자체의 오류로부터 사용자를 보호 할 수는 없습니다. 실제로 라이브러리 A와 B에 의존하는 응용 프로그램이있을 수 있습니다. 둘 다 호환되지 않는 버전의 라이브러리 C에 따라 달라질 수 있습니다.이 경우 라이브러리 C에 symbol versioning이없는 경우 프로그램을 중단 할 수 있습니다. ldd가 실행되지 않습니다. 경고 할 수는 있지만 출력에서 ​​볼 수 있어야합니다.

Program-Library-HOWTO이 유용 할 것입니다.

일부 옵션은 ldd 또는 dynamic linker입니다.

+0

0x2F48D76B 주위의 일부 코드가 손상되었다는 것을 알고 있다면 ldd 출력은 손상된 라이브러리 일 가능성을 배제합니까? – user108088

+0

마지막 편집을 참조하십시오. 질문에 대한 답변을 기다리십시오. –