Общая библиотека не загружается. Загрузка только под рутом

У меня есть исполняемый файл, для которого требуется общая библиотека, которая находится в папке /opt/.... Я включил путь в LD_LIBRARY_PATH в /etc/environment и обновил его, используя source /etc/environment. Когда я запускаю этот исполняемый файл без прав root, я получаю сообщение об ошибке libxxx.so: cannot open shared object file: No such file or directory. Но когда я запускаю его с sudo, он запускается. Хотя проблема в том, что лицензия не принадлежит пользователю root, поэтому она выдает ошибку относительно лицензии. Я изменил разрешение для /opt/..., чтобы обычный пользователь мог создавать и удалять файлы. Хотя это не помогает. Что не так и как мне это исправить?

3
задан 7 May 2013 в 19:48

1 ответ

/etc/environment интерпретируется при входе в систему. Таким образом, правильный способ увидеть изменения, которые вы внесли в /etc/environment, - выйти из системы и войти снова.

sudo работает, потому что частично эмулирует вход в систему как root (sudo -i эмулирует вход в систему еще более точно).

source /etc/environment не будет работать, потому что source - это команда оболочки, которая говорит оболочке интерпретировать данный файл как скрипт оболочки. Проблема в том, что /etc/environment не является сценарием оболочки. Это список пары переменной среды имя-значение в формате:

name="value"

Эта строка для оболочки является определением глобальной переменной , что видно только по самой оболочке. Программы, выполненные из оболочки, не видят этого. Правильный способ определения переменной среды - использовать команду оболочки export:

export name="value"

Итак, если вы действительно хотите использовать свой совершенно новый LD_LIBRARY_PATH без выхода из системы, вы должны выполнить следующую команду вместо source /etc/environment:

export LD_LIBRARY_PATH="/opt/..."

ОБНОВЛЕНИЕ: LD_LIBRARY_PATH нельзя установить в /etc/environment из-за ssh-agent. Подробности см. В ошибка № 47958 и на вики-странице Ubuntu по переменным среды . Как указано на вики-странице, существует обходной путь, заключающийся в использовании /etc/ld.so.conf.d.

Например, вы можете создать /etc/ld.so.conf.d/opt.conf со следующим содержанием:

# Paths for my cool libraries
/opt/...

Хотя это указано в качестве обходного пути, ld.so.conf.d на самом деле является наиболее подходящим местом для таких настроек.

0
ответ дан 7 May 2013 в 19:48

Другие вопросы по тегам:

Похожие вопросы: