无法为非root用户加载libsctp.so

时间:2010-04-01 10:35:45

标签: c++ c linux

我有一个使用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位才会出现此问题。

5 个答案:

答案 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#