如何让动态库从Ubuntu中的同一目录加载?

如何让动态库从Ubuntu中的同一目录加载?,ubuntu,dynamic-library,Ubuntu,Dynamic Library,我有一个动态链接到foo.so.0和bar.so.0的可执行文件。问题是,当我尝试运行可执行文件时,加载程序无法找到动态链接的库。(可执行文件链接到一个静态库,该库加载了动态版本,因此我不直接控制任何内容)。我发现我可以编辑LD_LIBRARY_PATH以包含当前目录,然后它会找到它。问题是,当程序以root用户身份运行时,由于某种原因,它仍然找不到库。LD\u LIBRARY\u路径方法是否错误?如果可以接受,那么为什么程序在sudo下运行时找不到库?默认情况下sudo,尤其是像LD_libr

我有一个动态链接到foo.so.0和bar.so.0的可执行文件。问题是,当我尝试运行可执行文件时,加载程序无法找到动态链接的库。(可执行文件链接到一个静态库,该库加载了动态版本,因此我不直接控制任何内容)。我发现我可以编辑
LD_LIBRARY_PATH
以包含当前目录,然后它会找到它。问题是,当程序以root用户身份运行时,由于某种原因,它仍然找不到库。
LD\u LIBRARY\u路径
方法是否错误?如果可以接受,那么为什么程序在sudo下运行时找不到库?

默认情况下
sudo
,尤其是像
LD_library\u PATH
这样危险的库——这是出于设计,因为否则,非特权用户可以通过设置环境变量将库注入特权进程,这将是一个相当大的安全漏洞

最好的解决方案可能是使用一个单独的启动器存根,它可以为主程序设置环境。例如,您可以有一个可以启动主程序的
setuid
程序,或者您可以有一个用户将启动的shell脚本,它将构造适当的
sudo
命令


但这感觉就像是一个案例,如果受伤了,那就别那么做。听起来你是故意试图规避系统上的正常安全和管理措施,这通常是个坏主意。听起来你可能有一个新的程序,所以你最好解释一下你实际上想做什么,而不是问你是怎么做的。

安东斯回答:如果是你的程序,你可以使用ld的-rpath(gcc的-Wl,-rpath)来修改它的库搜索路径。(并不是说这感觉不像是一次黑客攻击)。或者,您可以安装一个脚本,用LD_LIBRARY_PATH启动程序。或者,您可以将库放在默认搜索的位置。

为什么要从同一目录加载库?通常,在Linux上安装软件的正常机制是将二进制文件放在
/usr/bin
中,并将库放在
/usr/lib
中。IIRC sudo故意清除
LD\u LIBRARY\u路径。类似于sudo env LD_LIBRARY_PATH=/我的程序
应该可以运行,而不是
LD\u LIBRARY\u PATH=。sudo./my program
@DanielPryden我的程序不是故意安装到这些目录中的。
sudo
放弃大多数用户设置的环境作为安全措施。@chachacham15如果它是你的程序,你可以使用ld的
-rpath
(gcc的
-Wl,-rpath
)修改它的库搜索路径。(并不是说这感觉不像是一次黑客攻击)。或者,您可以安装一个脚本,用LD_LIBRARY_PATH启动程序。或者你可以把这些库放在默认情况下搜索它们的地方。看看AntonKovalenko的评论。这就是我需要的解决方案。@chacham15:哪一个?链接器参数,还是包装器外壳脚本?(后者正是我在第二段中提出的。)不管怎样,我认为我关于X-Y问题的观点仍然站得住脚:你已经找到了。@chacham15:另外,如果你已经找到了你需要的解决方案,继续把它添加为答案(或说服安东这样做),并将其标记为接受。这样,问题就被标记为已回答。