Введение / Зачем это нужно
Утилита ldd (List Dynamic Dependencies) — это стандартный инструмент в Linux для просмотра динамических зависимостей исполняемого файла. Она показывает, какие разделяемые библиотеки (файлы .so) требуется загрузить программе при запуске. Это незаменимо для:
- Диагностики ошибок
error while loading shared libraries: libXYZ.so: cannot open shared object file. - Понимания, какие пакеты нужно установить на чистую систему.
- Проверки целостности бинарника и обнаружения потенциальных проблем с
RPATH/RUNPATH.
После выполнения этого гайда вы сможете быстро находить и устранять проблемы с отсутствующими библиотеками.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть доступ к терминалу Linux (Ubuntu, CentOS, Fedora, Debian и т.д.).
- Установлена утилита
ldd. Обычно она входит в пакетlibc6(Debian/Ubuntu) илиglibc(RHEL/CentOS). Проверить можно командой:ldd --version - У вас есть исполняемый файл (ELF-формат), который нужно проанализировать. Это может быть любой бинарник в системе, например
/usr/bin/lsили ваш собственный скомпилированный файл. - У вас есть права на чтение файла. Если файл принадлежит другому пользователю, используйте
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, выполните:
- Найдите пакет, содержащий библиотеку. Для 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 - Установите найденный пакет:
sudo apt install имя_пакета # Debian/Ubuntu sudo yum install имя_пакета # RHEL/CentOS - Обновите кэш библиотек:
sudo ldconfig - Повторно проверьте файл командой
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 для детальной диагностики загрузки библиотек.