Команда ldd

Команда ldd предназначена для вызова одноименной утилиты, осуществляющей вывод списка разделяемых библиотек, используемых исполняемыми файлами или разделяемыми библиотеками. Разделяемые библиотеки обычно содержат реализации функций, которые необходимы для корректной работы приложений или других разделяемых библиотек. Разделяемые библиотеки (*.so) являются полным аналогом динамических библиотек (*.dll) из Windows.

Базовый синтаксис команды выглядит следующим образом:

$ ldd [параметры] [путь-к-разделяемой-библиотеке]

Утилита поддерживает параметр -v, позволяющий выводить дополнительную информацию о версиях используемых разделяемых библиотек, параметр -u, позволяющий выводить список связанных, но не используемых разделяемых библиотек, а также параметры -d и -r, позволяющие осуществлять релокации объектов данных и функций.

Рассматриваемая утилита может понадобиться в процессе разработки программного обеспечения, а также создания пакетов для его распространения.

Стоит упомянуть и о том, что система кэширует информацию о доступных разделяемых библиотеках и хранит ее в файле с именем /etc/ld.so.cache (файл не предназначен для редактирования с помощью обычного текстового редактора). Существует и файл конфигурации /etc/ld.so.conf, в котором содержится список путей к директориям, в которых размещены разделяемые библиотеки. Разделяемая библиотека с именем ld-linux-*.so выполняет функции динамического линковщика, то есть, осуществляет поиск необходимых для работы приложения разделяемых библиотек в кэше и загружает их. Помимо этого существует системная утилита ldconfig, предназначенная для обновления кэша разделяемых библиотек.

Также существует вспомогательная виртуальная разделяемая библиотека linux-vdso.so (или linux-gate.so на некоторых архитектурах), которая отображается ядром Linux в адресное пространство всех пользовательских процессов и используется библиотекой языка C libc для повышения производительности при работе с некоторыми системными вызовами. На нее не стоит обращать особого внимания.

Примеры использования

Вывод списка разделяемых библиотек, используемых приложением

Для вывода списка разделяемых библиотек, используемых приложением, следует передать утилите путь к интересующему приложению.

$ ldd /bin/nano
    linux-vdso.so.1 (0x00007ffc5e1d3000)
    libncursesw.so.6 => /lib/x86_64-linux-gnu/libncursesw.so.6 (0x00007fed3b9e8000)
    libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fed3b9b8000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed3b7c7000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fed3b7c1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fed3ba8f000)

Как видно, для работы приложения nano требуется ряд разделяемых библиотек, причем первой библиотекой является вспомогательная библиотека ядра Linux, а последней - библиотека динамического линковщика.

Вывод списка разделяемых библиотек, используемых разделяемой библиотекой

Для вывода списка разделяемых библиотек, используемых другой разделяемой библиотекой, следует передать утилите путь к интересующей разделяемой библиотеке.

$ ldd /lib/x86_64-linux-gnu/libc-2.30.so
    /lib64/ld-linux-x86-64.so.2 (0x00007f8d28fad000)
    linux-vdso.so.1 (0x00007ffe62b78000)

Библиотека libc использует лишь вспомогательные разделяемые библиотеки.

$ ldd /lib/x86_64-linux-gnu/libbz2.so.1
    linux-vdso.so.1 (0x00007ffc757cb000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3bd62f4000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3bd6516000)

Библиотека libbz2 использует библиотеку libc.

Вывод подробного списка разделяемых библиотек, используемых приложением

Для вывода подробного списка разделяемых библиотек, используемых приложением, следует использовать параметр -v.

$ ldd -v /bin/nano
    linux-vdso.so.1 (0x00007fff4cfcf000)
    libncursesw.so.6 => /lib/x86_64-linux-gnu/libncursesw.so.6 (0x00007f43c1744000)
    libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f43c1714000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f43c1523000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f43c151d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f43c17eb000)

    Version information:
    /bin/nano:
       libtinfo.so.6 (NCURSES6_TINFO_5.4.20040208) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.0.19991023) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libc.so.6 (GLIBC_2.27) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.6) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
       libncursesw.so.6 (NCURSESW6_5.7.20081102) => /lib/x86_64-linux-gnu/libncursesw.so.6
       libncursesw.so.6 (NCURSESW6_5.1.20000708) => /lib/x86_64-linux-gnu/libncursesw.so.6
   /lib/x86_64-linux-gnu/libncursesw.so.6:
       libdl.so.2 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libdl.so.2
       libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.9.20150530) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.5.20051010) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.1.20000708) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.2.20001021) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.6.20061217) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.7.20081102) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.8.20110226) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.4.20040208) => /lib/x86_64-linux-gnu/libtinfo.so.6
       libtinfo.so.6 (NCURSES6_TINFO_5.0.19991023) => /lib/x86_64-linux-gnu/libtinfo.so.6
   /lib/x86_64-linux-gnu/libtinfo.so.6:
       libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.16) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
   /lib/x86_64-linux-gnu/libc.so.6:
       ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
       ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
   /lib/x86_64-linux-gnu/libdl.so.2:
       ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
       libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
       libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6

Информация о версиях библиотек приведена в разделе Version information.