Что означает ошибка ld.so
Ошибка ld.so (или ld-linux.so) возникает, когда динамический компоновщик Linux не может найти разделяемую библиотеку (shared library), необходимую для запуска программы. Полное сообщение обычно выглядит так:
error while loading shared libraries: libexample.so.1: cannot open shared object file: No such file or directory
Это означает, что исполняемый файл требует библиотеку libexample.so.1, но загрузчик не находит её в стандартных путях. Ошибка появляется сразу при попытке запуска команды в терминале и предотвращает выполнение программы.
Причины возникновения
- Не установлена необходимая библиотека — программа зависит от библиотеки, которая отсутствует в системе.
- Библиотека установлена в нестандартный путь — загрузчик ищет библиотеки только в каталогах, указанных в
/etc/ld.so.confи переменнойLD_LIBRARY_PATH. - Неправильные права доступа — у текущего пользователя нет прав на чтение файла библиотеки.
- Повреждение библиотеки — файл библиотеки повреждён или имеет неверный формат.
- Несоответствие архитектуры — например, 32-битная библиотека для 64-битной программы (или наоборот).
- Устаревшая версия библиотеки — программа требует конкретную версию (например,
libssl.so.1.1), а в системе установлена другая (например,libssl.so.3).
Способ 1: Установка недостающей библиотеки
Самый частый случай — библиотека просто не установлена. Сначала определите, какой пакет предоставляет нужную библиотеку.
Для Ubuntu/Debian:
# Поиск пакета, содержащего библиотеку (например, libssl.so.1.1)
apt-file search libssl.so.1.1
# Если apt-file не установлен, сначала установите его:
sudo apt update && sudo apt install apt-file && sudo apt-file update
# Затем установите найденный пакет:
sudo apt install libssl1.1
Для CentOS/RHEL/Fedora:
# Поиск пакета
yum provides */libssl.so.1.1
# Или для Fedora с dnf:
dnf provides */libssl.so.1.1
# Установка пакета:
sudo yum install openssl-libs
# или
sudo dnf install openssl-libs
⚠️ Важно: Имя библиотеки в ошибке (например,
libssl.so.1.1) может отличаться от имени пакета. Убедитесь, что устанавливаете пакет с соответствующей версией.
Способ 2: Добавление пути к библиотекам в LD_LIBRARY_PATH
Если библиотека уже есть в системе, но находится в нестандартном каталоге (например, в /home/user/app/lib), вы можете временно добавить этот путь в переменную окружения LD_LIBRARY_PATH.
# Для текущей сессии терминала:
export LD_LIBRARY_PATH=/home/user/app/lib:$LD_LIBRARY_PATH
# Затем попробуйте запустить программу снова.
Чтобы сделать изменение постоянным, добавьте строку в ~/.bashrc или ~/.profile:
echo 'export LD_LIBRARY_PATH="/home/user/app/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
source ~/.bashrc
💡 Совет: Используйте этот способ только для пользовательских установок. Для системных библиотек лучше настроить
ldconfig(см. Способ 3).
Способ 3: Обновление кэша библиотек (ldconfig)
Если библиотека установлена в стандартный системный путь (например, /usr/local/lib), но загрузчик её не видит, возможно, кэш устарел. Обновите его:
# Добавьте каталог в конфигурацию ld.so, если его там нет:
echo '/usr/local/lib' | sudo tee -a /etc/ld.so.conf.d/custom.conf
# Обновите кэш:
sudo ldconfig
После этого загрузчик будет знать о новых библиотеках. Проверьте, видна ли библиотека:
ldconfig -p | grep libexample
Способ 4: Проверка архитектуры и зависимостей
Убедитесь, что архитектура библиотеки соответствует программе.
# Проверка архитектуры библиотеки:
file /usr/lib/x86_64-linux-gnu/libexample.so.1
# Пример вывода: libexample.so.1: ELF 64-bit LSB shared object, x86-64, ...
# Проверка архитектуры исполняемого файла:
file /usr/bin/example-program
Если программа 64-битная, а библиотека 32-битная (или наоборот), нужно установить библиотеку правильной архитектуры. Например, в Ubuntu для 32-битных библиотек есть пакеты с суффиксом :i386.
Также проверьте все зависимости программы с помощью ldd:
ldd /usr/bin/example-program
Эта команда покажет, какие библиотеки загружаются и какие из них не найдены (отметка not found).
Способ 5: Переустановка приложения
Если библиотека поставляется вместе с приложением (например, в папке app/lib), возможно, файлы повреждены или неполные. Переустановите приложение:
# Для приложения, установленного из репозитория:
sudo apt reinstall example-package
# Для приложения, скачанного вручную:
# Удалите папку приложения и загрузите заново.
Если приложение использует локальные библиотеки, убедитесь, что скрипт запуска правильно задаёт LD_LIBRARY_PATH или использует rpath.
Профилактика
- Устанавливайте библиотеки из официальных репозиториев — это гарантирует совместимость и автоматическое обновление.
- При компиляции программ из исходников используйте
--prefix=/usr/localи выполняйтеsudo ldconfigпослеmake install. - Избегайте ручного копирования библиотек в системные пути без обновления кэша.
- Регулярно обновляйте систему —
sudo apt update && sudo apt upgrade(или аналоги для вашего дистрибутива). - Используйте контейнеры (Docker) для изоляции зависимостей, если нужно избежать конфликтов библиотек.
Если проблема возникает у нескольких программ одновременно, возможно, повреждены системные библиотеки. В таком случае рассмотрите восстановление пакетов:
# Ubuntu/Debian:
sudo apt install --reinstall libc6 libstdc++6
# CentOS/RHEL:
sudo yum reinstall glibc libstdc++