【问题标题】:Unable to load libsctp.so for non root user无法为非 root 用户加载 libsctp.so
【发布时间】:2010-04-01 10:35:44
【问题描述】:

我有一个使用 libsctp.so 库的 Linux 应用程序。当我以 root 身份运行它时,它运行良好。

但是当我以普通用户的身份运行它时,它给出了以下错误:

加载共享库时出错:libsctp.so.1: cannot open shared object file: No such file or directory

但是,当我以普通用户身份执行 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,但实际运行app却找不到同一个库?

编辑:刚刚观察到,仅当为 myapp 设置了 setuid 位时才会出现此问题。

【问题讨论】:

  • 在您的应用上运行 strace,看看会发生什么。 libsctp.so.1 也是指向其他东西的符号链接吗?
  • strace 显示以下输出: open("/usr/lib/libsctp.so.1", O_RDONLY) = -1 ENOENT (没有这样的文件或目录)。另外,我还发现了一些别的东西:这个应用程序设置了 setuid 位。即 ls -l myapp: -rwsrwxr-x 1 root root 2260821 2010-04-01 17:55 myapp。如果我删除该 setuid 位,则它能够找到该库。只有设置了 setuid 位,才能找到库。

标签: c++ c linux


【解决方案1】:

执行以下代码后,我在 Ubuntu 18.04 上遇到了同样的异常:

SctpServerChannel s = SctpServerChannel.open();

运行后问题解决:

sudo apt-get install libsctp1

【讨论】:

    【解决方案2】:

    解决了这个问题。我在 /etc/ld.so.conf.d 中添加了一个具有以下名称的新文件:

    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 变得可用。

    【讨论】:

      【解决方案3】:

      可能是因为环境设置不同。

      您可能需要将 /usr/local/lib/ 添加到 LIBRARY_PATH 或类似的位置。

      【讨论】:

      • 我已经在 LD_LIBRARY_PATH 中有 /usr/local/lib。 AFAIK,ldd 也依赖于相同的环境设置。
      • @sankoz,我明白了,如果是我,我会在 root 上执行 env | grep "/usr/local/lib/" 并尝试将所有匹配的行也复制到非 root 用户。它甚至可能需要添加到 PATH 中,但这并不正常。
      • @S.Mark,唯一的环境变量是PATH,我已经复制了。
      【解决方案4】:

      如果找不到libsctp.so 本身所依赖的共享库,您可能会收到该错误(是的,这有点令人困惑)。在库本身上尝试ldd

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

      【讨论】:

      • 库上的 ldd 工作正常。 [sanjeev@devtest6 src]$ ldd /usr/local/lib/libsctp.so.1 linux-gate.so.1 => (0x0034a000) libc.so.6 => /lib/libc.so.6 (0x008ec000) /lib/ld-linux.so.2 (0x0070b000)
      【解决方案5】:

      你是在切换到root用户之前还是之后设置LD_LIBRARY_PATH?当您以 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 密码: debian:/home/dmitry# echo $LD_LIBRARY_PATH debian:/home/dmitry#

      【讨论】:

      • 我在两种情况下都设置了 LD_LIBRARY_PATH(root 和非 root)。 ldd 作为 root 和非 root 产生相同的结果。
      猜你喜欢
      • 2013-10-07
      • 2020-10-02
      • 2016-05-04
      • 2016-08-17
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多