Трассировка связанных библиотек

Я получаю некоторые ошибки, которые заставляют меня думать, что моя программа Linux не связывается с библиотеками, она, как предполагается. Как я могу получить полный путь ко всем связанным библиотекам? Я знаю ldd даст мне имена, но как я могу использовать это для получения полного пути?

Спасибо.

0
задан user108088 3 August 2010 в 16:44
поделиться

1 ответ

На самом деле 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)

Библиотеки ищутся по их soname (например, 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 нет управления версиями символов ]) - ldd не будет предупреждать вас, но вы должны увидеть это в выводе.

Программа-Библиотека-HOWTO будет вам полезна.

Также проверьте некоторые параметры ldd или динамического компоновщика .

6
ответ дан 4 September 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: