Linux

Как использовать ldd для анализа зависимостей библиотек в Linux

Это руководство объясняет, как использовать утилиту ldd для отображения зависимостей динамических библиотек в Linux. Вы научитесь анализировать исполняемые файлы и находить недостающие библиотеки.

Обновлено 17 февраля 2026 г.
5-10 мин
Низкая
FixPedia Team
Применимо к:Linux (Ubuntu 22.04+, CentOS 7+, Debian 11+)Любой дистрибутив с установленной утилитой ldd

Введение / Зачем это нужно

Утилита ldd (List Dynamic Dependencies) — это стандартный инструмент в Linux для просмотра динамических зависимостей исполняемого файла. Она показывает, какие разделяемые библиотеки (файлы .so) требуется загрузить программе при запуске. Это незаменимо для:

  • Диагностики ошибок error while loading shared libraries: libXYZ.so: cannot open shared object file.
  • Понимания, какие пакеты нужно установить на чистую систему.
  • Проверки целостности бинарника и обнаружения потенциальных проблем с RPATH/RUNPATH.

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

Требования / Подготовка

Перед началом убедитесь, что:

  1. У вас есть доступ к терминалу Linux (Ubuntu, CentOS, Fedora, Debian и т.д.).
  2. Установлена утилита ldd. Обычно она входит в пакет libc6 (Debian/Ubuntu) или glibc (RHEL/CentOS). Проверить можно командой:
    ldd --version
    
  3. У вас есть исполняемый файл (ELF-формат), который нужно проанализировать. Это может быть любой бинарник в системе, например /usr/bin/ls или ваш собственный скомпилированный файл.
  4. У вас есть права на чтение файла. Если файл принадлежит другому пользователю, используйте sudo или скопируйте его в свою директорию.

Пошаговая инструкция

Шаг 1: Базовый запуск ldd

Просто укажите путь к исполняемому файлу:

ldd /bin/ls

Пример вывода:

linux-vdso.so.1 (0x00007ffd6d7f9000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8c1a400000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8c19e00000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f8c19a00000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8c1a800000)

Каждая строка содержит:

  • Имя библиотеки (например, libc.so.6).
  • Стрелка => и полный путь, по которому библиотека будет загружена.
  • Адрес в памяти (в скобках), если библиотека уже загружена в текущем процессе (может отличаться при каждом запуске).

Шаг 2: Интерпретация ключевых элементов

  • linux-vdso.so.1 — виртуальная динамическая библиотека, предоставляемая ядром (не реальный файл на диске).
  • /lib64/ld-linux-x86-64.so.2 — динамический загрузчик (интерпретатор), без него программа не запустится.
  • Если вместо пути указано not found, библиотека отсутствует в стандартных путях поиска (/lib, /usr/lib, LD_LIBRARY_PATH).

Шаг 3: Обработка отсутствующих библиотек

Если в выводе есть строки вида libsomething.so => not found, выполните:

  1. Найдите пакет, содержащий библиотеку. Для Debian/Ubuntu:
    apt-file search libsomething.so
    

    Если apt-file не установлен,先 установите его: sudo apt update && sudo apt install apt-file && sudo apt-file update.
    Для RHEL/CentOS/Fedora:
    yum provides */libsomething.so
    

    или
    dnf provides */libsomething.so
    
  2. Установите найденный пакет:
    sudo apt install имя_пакета   # Debian/Ubuntu
    sudo yum install имя_пакета   # RHEL/CentOS
    
  3. Обновите кэш библиотек:
    sudo ldconfig
    
  4. Повторно проверьте файл командой ldd.

Шаг 4: Использование опций для расширенного анализа

  • -v (verbose) — показывает все совпадения библиотек, включая дубликаты, и версии.
    ldd -v /usr/bin/ssh
    
  • -u — выводит неиспользуемые прямые зависимости (полезно для очистки DT_NEEDED в ELF-заголовке).
    ldd -u /usr/bin/ssh
    
  • --version — показывает версию утилиты ldd.

Шаг 5: Безопасность и альтернативы

⚠️ Важно: Запуск ldd на недоверенных исполняемых файлах может быть опасен! Некоторые бинарники могут выполнить код через DT_RPATH/DT_RUNPATH. Вместо ldd для безопасности используйте:

objdump -p /path/to/file | grep NEEDED

или

readelf -d /path/to/file | grep NEEDED

Эти команды только читают ELF-заголовок, не выполняя никакого кода.

Проверка результата

Успешный результат:

  • В выводе ldd отсутствуют строки с not found.
  • Все библиотеки имеют полные пути.
  • Динамический загрузчик (ld-linux.so) указан корректно.

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

Возможные проблемы

ПроблемаСимптомыРешение
Библиотека не найденаlibXYZ.so => not foundУстановите пакет, содержащий библиотеку, и выполните sudo ldconfig.
Неправильная архитектураldd: /path/file: failed to load module: invalid ELF headerФайл скомпилирован для другой архитектуры (например, 32-битный на 64-битной системе). Установите совместимые библиотеки (например, libc6-i386).
Статический бинарникstatically linked в выводеБиблиотеки встроены в файл. Зависимости отсутствуют, ldd не применим.
Нет прав на чтениеldd: /path/file: Permission deniedДобавьте права: chmod +r /path/file или используйте sudo ldd /path/file (осторожно!).
Устаревшая версия lddНеожиданный формат вывода или ошибкиОбновите пакет libc6/glibc: sudo apt upgrade libc6 или sudo yum update glibc.

Если проблема не решена, проверьте переменные окружения LD_LIBRARY_PATH и LD_DEBUG для детальной диагностики загрузки библиотек.

Часто задаваемые вопросы

Зачем вообще нужна команда ldd?
Можно ли использовать ldd для статических бинарников?
Безопасно ли запускать ldd на неизвестных файлах?
Что делать, если ldd показывает 'not found' для библиотеки?

Полезное

Проверьте наличие утилиты ldd
Запустите ldd на целевом исполняемом файле
Проанализируйте вывод
Установите недостающие библиотеки
Используйте дополнительные опции для детального анализа

Эта статья помогла вам решить проблему?