为啥共享库可以定位为一个用户,而不是另一个?

Posted

技术标签:

【中文标题】为啥共享库可以定位为一个用户,而不是另一个?【英文标题】:Why can shared libraries be located as one user, but not as another?为什么共享库可以定位为一个用户,而不是另一个? 【发布时间】:2013-07-11 21:39:29 【问题描述】:

我编译了一个需要以其他用户身份运行的 Qt 应用程序。但是,当它以该用户身份运行时,它无法加载 Qt 共享库:

~/MyApp/src $ sudo -u otherUser ./MyApp
./MyApp: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory

ldd 设为otherUser,我们看到了预期:

~/MyApp/src $ sudo -u otherUser ldd ./MyApp
libQtGui.so.4 => not found

但是,当我以自己的身份执行ldd 时,我可以找到libQtGui.so.4 共享库就好了。

~/MyApp/src $ ldd ./MyApp
libQtGui.so.4 => /usr/local/Trolltech/Qt-4.8.5/lib/libQtGui.so.4 (0x00002b97a4e1a000)
libQtNetwork.so.4 => /usr/local/Trolltech/Qt-4.8.5/lib/libQtNetwork.so.4 (0x00002b97a5bf1000)

为什么otherUser 找不到共享库?我需要做什么才能使MyApp 可以被otherUser 执行?

我的 LD_LIBRARY_PATH 对于两个用户来说似乎都是空的:

~/MyApp/src $ echo $LD_LIBRARY_PATH

~/MyApp/src $ sudo -u otherUser echo $LD_LIBRARY_PATH

~/MyApp/src $

【问题讨论】:

otherUser可以访问共享库文件吗? 用户之间LD_LIBRARY_PATH有区别吗? ./Myapp,当从 ~/MyApp/src 执行时,转换为 ~/MyApp/src/Myapp @DavidBrown,是的,我做了一个chmod -R 777 /usr/local/Trolltech/Qt-4.8.5 @RobertHarvey,几乎,A 是大写的。所以应用程序存在于 ~/MyApp/src/MyApp 【参考方案1】:

otherUser 必须能够访问通向共享库的整个目录路径。检查路径中的所有文件夹:

/usr/local/Trolltech/Qt-4.8.5/lib/

otherUser 应该可以访问 usrlocalTrolltechQt-4.8.5lib

在我遇到此问题的具体情况下,otherUser 无法访问 Trolltech 目录。

【讨论】:

【参考方案2】:

检查您的 LD_LIBRARY_PATH 环境变量。

echo $LD_LIBRARY_PATH

您可能会发现您的用户与其他用户的路径不同。您可能需要为找不到库的用户设置(或更新)此变量。

【讨论】:

以上是关于为啥共享库可以定位为一个用户,而不是另一个?的主要内容,如果未能解决你的问题,请参考以下文章

Linux,共享库使用主程序中的函数而不是其他共享库

修改 glibc 动态链接器以检查共享库是不是已在另一个进程中加载

我可以让共享库构造函数在重定位之前执行吗?

Android 在两个应用程序之间共享用户 ID

Linux - 为啥我的可执行文件将 libpthread 作为共享库?

在 linux 中使用另一个共享库构建共享库