代码之家  ›  专栏  ›  技术社区  ›  sankoz

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

  •  3
  • sankoz  · 技术社区  · 14 年前

    我有一个使用libsctp.so库的Linux应用程序。当我作为根运行时,它运行良好。

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

    加载共享库时出错:libsctp.so.1:无法打开共享对象文件:没有这样的文件或目录

    但是,当我作为普通用户使用ldd时,它可以看到库:

    [sanjeev@devtest6 src]$ldd我的应用程序

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

    [sanjeev@devtest6 src]$ls-ll/usr/local/lib/libsctp.so.1

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

    [圣洁@devtest6 src]$

    怎么了?ldd是如何找到libsctp.so的,但是在实际运行应用程序时,它找不到相同的库?

    编辑:刚刚注意到,只有在为myapp设置setuid位时才会出现此问题。

    4 回复  |  直到 14 年前
        1
  •  1
  •   YOU    14 年前

    可能是因为环境设定的不同。

    您可能需要添加 /usr/local/lib/ 去图书馆的路或那种。

        2
  •  1
  •   sankoz    14 年前

    解决了这个问题。我在/etc/ld.so.conf.d中添加了一个新文件,文件名如下:

    libsctp.so.1.conf文件

    libsctp.so.1.conf的内容如下:

    /usr/本地/lib/

    然后跑

    /sbin/ldconfig

    ,之后我的应用程序成功运行。

    说明:由于设置了setuid位,因此程序以根用户身份执行,对于根用户,ld_library_path不可用。因此无法找到libsctp.so。我没有意识到这一点,因为当我以根用户身份登录时,.bashrc被执行,并且ld_library_path变为可用。

        3
  •  0
  •   caf    14 年前

    如果共享库 libsctp.so 它本身依赖于不被发现(是的,它有点混乱)。尝试 ldd 关于图书馆本身:

    ldd /usr/local/lib/libsctp.so.1
    
        4
  •  0
  •   Dmitry Yudakov    14 年前

    你准备好了吗 LD_LIBRARY_PATH 在切换到根用户之前还是之后?当你奔跑 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#