Команда Linux ldd
ldd (список динамических зависимостей) — очень полезный инструмент командной строки в системах Linux, используемый для отображения динамических библиотек, от которых зависит программа или разделяемая библиотека. При запуске программы в Linux системе необходимо загрузить различные разделяемые библиотеки (файлы .so), от которых зависит программа; ldd — это инструмент, используемый для просмотра этих зависимостей.
Базовый синтаксис команды ldd
ldd [选项] 可执行文件或共享库
Общие опции и описание параметров
| Опция | Описание |
|---|---|
| -v | Показать подробную информацию о версии |
| -u | Показать неиспользуемые прямые зависимости |
| -d | Выполнить перемещение и сообщить об отсутствующих функциях |
| -r | Выполнить перемещение и сообщить об отсутствующих функциях и данных |
| --help | Показать справочную информацию |
Как работает команда ldd
ldd на самом деле — это скрипт, который запускает целевую программу, устанавливая специальные переменные окружения, так что программа отображает информацию о своих зависимых библиотеках при загрузке вместо обычного выполнения. В частности:
- Для исполняемых файлов формата ELF ldd анализирует их динамический сегмент.
- Он проверяет записи DT_NEEDED, чтобы определить необходимые разделяемые библиотеки.
- Он ищет эти файлы библиотек в системных путях к библиотекам.
- Он отображает полный путь и карту адресов памяти каждой библиотеки.
Примеры использования
Пример 1: Просмотр зависимостей простой программы
ldd /bin/ls
Типичный вывод:
linux-vdso.so.1 (0x00007ffd5a3f0000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8e4a3b0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e4a1c0000) libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f8e4a130000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8e4a120000) /lib64/ld-linux-x86-64.so.2 (0x00007f8e4a400000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8e4a100000)
Пример 2: Проверка неиспользуемых прямых зависимостей
ldd -u /usr/bin/python3
Пример 3: Просмотр зависимостей в подробном режиме
ldd -v /usr/bin/gcc
Практические сценарии применения
Сценарий 1: Устранение ошибок "library not found"
Когда программа не может запуститься из-за отсутствующей библиотеки, ldd может помочь быстро определить проблему:
ldd ./my_program | grep "not found"
Сценарий 2: Проверка конфликтов версий библиотек
ldd -r ./my_program
Сценарий 3: Проверка правильности пути к библиотеке
ldd /path/to/your/executable | awk '{print $3}' | xargs ls -la
Примечания и распространённые проблемы
-
Предупреждение по безопасности: Не используйте ldd для недоверенных исполняемых файлов, поскольку он фактически пытается выполнить части кода программы.
- Альтернативы:
objdump -p /path/to/program | grep NEEDED
- Альтернативы:
-
Статически скомпонованные программы: Для полностью статически скомпонованных программ ldd выведет "not a dynamic executable".
-
Среды кросс-компиляции: В средах кросс-компиляции необходимо использовать инструмент ldd, соответствующий целевой платформе.
-
Распространённые ошибки:
ldd: ./program: No such file or directory→ Возможно, это связано с отсутствующим интерпретатором или с тем, что сама программа не существуетldd: exited with unknown exit code→ Программа может аварийно завершиться во время выполнения
Продвинутые советы
1. Используйте readelf для просмотра более детальной информации о зависимостях
readelf -d /path/to/program | grep NEEDED
2. Используйте переменную окружения LD_TRACE_LOADED_OBJECTS
LD_TRACE_LOADED_OBJECTS=1 /path/to/program
3. Проверьте дерево зависимостей библиотек
ldd /path/to/library.so | awk '{print $3}' | xargs ldd
Итог
ldd — незаменимый инструмент в администрировании Linux и отладке программ. Он позволяет:
- Быстро отображать зависимости программы от динамических библиотек
- Помогать решать проблемы отсутствующих библиотек или конфликтов версий
- Проверять, полноценна ли среда выполнения программы
- Помогать при упаковке и развёртывании программного обеспечения
Освоение использования команды ldd может значительно повысить вашу эффективность в решении проблем зависимостей в среде Linux.
Другие расширения
Энциклопедия команд Linux