2010-04-01 6 views
3

У меня есть приложение Linux, которое использует библиотеку libsctp.so. Когда я запускаю его как root, он работает нормально.Невозможно загрузить libsctp.so для пользователя без root

Но когда я запускаю его как обычный пользователь, он дает следующее сообщение об ошибке:

error while loading shared libraries: libsctp.so.1: cannot open shared object file: No such file or directory

Но, когда я LDD, как обычный пользователь, он способен видеть библиотеку:

[[email protected] src]$ ldd myapp

... 
    ... 
    libsctp.so.1 => /usr/local/lib/libsctp.so.1 (0x00d17000) 

[[email protected] src]$ ls -lL /usr/local/lib/libsctp.so.1

-rwxrwxrwx 1 root root 27430 2009-06-29 11:26 /usr/local/lib/libsctp.so.1

[[email protected] src]$

Что может быть неправильным? Как ldd может найти libsctp.so, но при запуске приложения он не может найти одну и ту же библиотеку?

РЕДАКТИРОВАТЬ: Просто заметил, что эта проблема возникает, только если бит setuid установлен для myapp.

+0

запустить strace на вашем приложении, посмотреть, что произойдет. Также libsctp.so.1 символическая ссылка на что-то еще? – nos

+0

strace показывает следующий результат: open ("/ usr/lib/libsctp.so.1", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога). Кроме того, я узнал что-то еще: у этого приложения установлен бит setuid. то есть ls -l myapp: -rwsrwxr-x 1 корень root 2260821 2010-04-01 17:55 myapp. Если я удалю этот бит setuid, тогда он сможет найти библиотеку. Только если бит setuid установлен, он не может найти библиотеку. – sankoz

ответ

1

Исправлена ​​ошибка. Я добавил новый файл в /etc/ld.so.conf.d с followng названием:

libsctp.so.1.conf

Содержание libsctp.so.1.conf заключается в следующем:

/usr/local/lib/

И затем бежит

/sbin/ldconfig

, после чего мое приложение успешно работает.

Пояснение: Поскольку бит setuid был установлен, программа выполняется как root, для которой LD_LIBRARY_PATH недоступен. Следовательно, он не может найти libsctp.so. Я не знал об этом, потому что, когда я вхожу в систему с правами root, .bashrc запускается и LD_LIBRARY_PATH становится доступным.

1

Это может быть из-за окружающей среды установка разница.

Возможно, вам понадобится добавить /usr/local/lib/ в LIBRARY_PATH или его тип.

+0

У меня уже есть/usr/local/lib в LD_LIBRARY_PATH. AFAIK, ldd также зависит от той же настройки среды. – sankoz

+0

@sankoz, я вижу, если я, я просто сделаю 'env | grep "/ usr/local/lib /" 'на root и попытается скопировать все сопоставленные строки и для пользователя без полномочий root. Это может даже потребоваться добавить к PATH, что не так нормально. – YOU

+0

@ S.Mark, единственная переменная env - PATH, которую я скопировал. – sankoz

0

Вы можете получить эту ошибку, если не найдена общая библиотека, из которой libsctp.so не зависит (да, это немного запутанно). Попробуйте ldd на самой библиотеке:

ldd /usr/local/lib/libsctp.so.1 
+0

ldd в библиотеке работает нормально. [Санджив @ devtest6 ЦСИ] $ LDD /usr/local/lib/libsctp.so.1 \t линукс-gate.so.1 => (0x0034a000) \t libc.so.6 => /lib/libc.so .6 (0x008ec000) \t /lib/ld-linux.so.2 (0x0070b000) – sankoz

0

настраиваете вы LD_LIBRARY_PATH перед переключением на суперпользователя или после этого? Когда вы запускаете ldd как root, он все равно находит все зависимые библиотеки?

 
[email protected]:~$ echo $LD_LIBRARY_PATH 

[email protected]:~$ export LD_LIBRARY_PATH=/usr/local/lib 
[email protected]:~$ echo $LD_LIBRARY_PATH 
/usr/local/lib 
[email protected]:~$ su 
Password: 
debian:/home/dmitry# echo $LD_LIBRARY_PATH 

debian:/home/dmitry# 
+0

Я установил LD_LIBRARY_PATH в обоих случаях (root и non-root). ldd как root и non-root дают тот же результат. – sankoz

Смежные вопросы