2010-04-01 118 views
3

我有一個使用libsctp.so庫的Linux應用程序。當我以root身份運行它時,它運行良好。無法爲非root用戶加載libsctp.so

但是當我運行它作爲一個普通用戶,它提供了以下錯誤:

error while loading shared libraries: libsctp.so.1: cannot open shared object file: No such file or directory

但是,當我做ldd的普通用戶,它能夠看到該庫:

[[email protected] src]$ ldd myapp

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

[[email protected] 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

[[email protected] src]$

什麼可能是錯誤的? ldd如何能夠找到libsctp.so,但是當實際運行應用程序時,它無法找到相同的庫?

編輯:只是觀察到,只有setuid位爲myapp設置此問題纔出現。

+0

在您的應用上運行strace,看看會發生什麼。 libsctp.so.1是另一種符號鏈接嗎? – nos 2010-04-01 10:51:01

+0

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位被設置,它才能找到庫。 – sankoz 2010-04-01 12:27:48

回答

1

修復了這個問題。我加入/etc/ld.so.conf.d一個新的文件與followng名稱:

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變爲可用。

1

這可能是因爲環境設置的差異。

您可能需要將/usr/local/lib/添加到LIBRARY_PATH或種。

+0

我已在LD_LIBRARY_PATH中擁有/ usr/local/lib。 AFAIK,ldd也依賴於相同的環境設置。 – sankoz 2010-04-01 10:42:44

+0

@sankoz,我明白了,如果我,我會做'env | grep「/ usr/local/lib /」,並嘗試將所有匹配的行復制到非root用戶。它甚至可能需要添加到PATH中,但這並不正常。 – YOU 2010-04-01 10:51:20

+0

@ S.Mark,唯一的env變量是我已經複製的PATH。 – sankoz 2010-04-01 11:29:06

0

如果libsctp.so本身依賴的共享庫未找到(是的,它有點令人困惑),那麼可以收到該錯誤。切換到root用戶之後或之前

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

庫上的ldd工作正常。 [sanjeev @ devtest6 src] $ ldd /usr/local/lib/libsctp.so.1 \t linux-gate.so.1 =>(0x0034a000) \t libc.so.6 => /lib/libc.so .6(0x008ec000) \t /lib/ld-linux.so.2(0x0070b000) – sankoz 2010-04-01 10:46:53

0

你要爲LD_LIBRARY_PATH:嘗試在庫本身ldd?當你以root身份運行ldd時,它仍然可以找到所有依賴庫?

 
[email protected]:~$ echo $LD_LIBRARY_PATH 

[email protected]:~$ export LD_LIBRARY_PATH=/usr/local/lib 
[email protected]:~$ echo $LD_LIBRARY_PATH 
/usr/local/lib 
[email protected]:~$ su 
Password: 
debian:/home/dmitry# echo $LD_LIBRARY_PATH 

debian:/home/dmitry# 
+0

在這兩種情況下(root和非root)我都設置了LD_LIBRARY_PATH。 ldd作爲root和non-root產生相同的結果。 – sankoz 2010-04-01 16:09:57

相關問題