【发布时间】: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 位,才能找到库。