我有一个使用libsctp.so库的Linux应用程序。当我以root身份运行它时,运行正常。
但是当我以普通用户身份运行时,它会出现以下错误:
加载共享库时出现错误:libsctp.so.1:无法打开共享对象文件:没有这样的文件或目录
但是,当我以普通用户身份执行ldd时,它可以看到库:
[sanjeev @ devtest6 src] $ ldd myapp
... ... libsctp.so.1 => /usr/local/lib/libsctp.so.1 (0x00d17000)
[sanjeev @ devtest6 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
[sanjeev @ devtest6 src] $
可能有什么不对? ldd如何能够找到libsctp.so,但在实际运行应用程序时,它无法找到相同的库?
编辑:刚刚观察到只有为myapp设置了setuid位才会出现此问题。答案 0 :(得分:2)
在执行以下代码后,我在 Ubuntu 18.04 上遇到了同样的异常:
SctpServerChannel s = SctpServerChannel.open();
运行后问题解决:
sudo apt-get install libsctp1
答案 1 :(得分:1)
可能是因为环境设置不同。
您可能需要将/usr/local/lib/
添加到LIBRARY_PATH或其中。
答案 2 :(得分:1)
修正了问题。我在/etc/ld.so.conf.d中添加了一个新文件,其中包含以下名称:
<强> libsctp.so.1.conf 强>
libsctp.so.1.conf的内容如下:
<强>的/ usr /本地/ LIB / 强>
然后跑
/ sbin目录/ LDCONFIG
,之后我的应用程序成功运行。
说明:由于setuid位已设置,程序以root身份执行,LD_LIBRARY_PATH不可用。因此它无法找到libsctp.so。我没有意识到这一点,因为当我以root身份登录时,.bashrc被执行并且LD_LIBRARY_PATH变为可用。
答案 3 :(得分:0)
如果找不到libsctp.so
本身所依赖的共享库,则可以收到该错误(是的,这有点令人困惑)。在库本身上尝试ldd
:
ldd /usr/local/lib/libsctp.so.1
答案 4 :(得分:0)
您是在设置LD_LIBRARY_PATH
之前切换到root用户还是之后?以root身份运行ldd
时,它仍然可以找到所有依赖库吗?
dmitry@debian:~$ echo $LD_LIBRARY_PATH dmitry@debian:~$ export LD_LIBRARY_PATH=/usr/local/lib dmitry@debian:~$ echo $LD_LIBRARY_PATH /usr/local/lib dmitry@debian:~$ su Password: debian:/home/dmitry# echo $LD_LIBRARY_PATH debian:/home/dmitry#