2010-08-03 4 views
0

Я получаю некоторые ошибки, которые заставляют меня думать, что моя программа Linux не связана с библиотеками, которые она должна. Как я могу получить полный путь ко всем связанным библиотекам? Я знаю, что 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) 

библиотеки просматриваются его игнорирован (например libboost_filesystem-mt.so.1.38.0) в путях, указанных в /etc/ld.so.conf, LD_LIBRARY_PATH или набор с rpath в самой двоичной системе.

Если 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

см. Мое последнее изменение, я надеюсь, что он ответит на ваш вопрос –

Смежные вопросы