Linux二进制文件找不到共享库,但在strace中运行时工作

时间:2013-08-08 16:04:28

标签: shared-libraries strace

(注意:下面的二进制文件和二进制文件以及库的名称都是混淆的,以保护无辜。;-)该应用程序是NDA专有的,但行为可能不依赖于它。)

我有一个Linux二进制文件,在运行时会输出以下错误:

  

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

由于libshared.so位于LD_LIBRARY_PATH中,因此自身令人困惑。然而,

  • 运行ldd binary时找到了正确的库(即ldd输出指向文件位置)

  • 运行strace binary时找到了正确的库,以便程序设法打印其使用信息!

我从未见过一个应用程序,当它自行运行而不是在strace中运行时表现不同,但我想也许其他人已经看到过这种情况发生之前?有任何想法如何解决这个问题?

我没有源,所以我无法重建。在strace下运行应用程序可能不是首发。操作系统是RHEL 6.2。

1 个答案:

答案 0 :(得分:6)

(老问题,但希望这会对其他人有帮助)

在新的Linux安装中,标准系统运行时链接程序不会将LD_LIBRARY_PATH用于设置了SUID的程序。似乎strace,gdb和朋友的工作方式不同,使用LD_LIBRARY_PATH。

对于suid程序,必须在系统库缓存中找到所有库。使用

检查(以root用户身份)是否存在“缺失”库
ldconfig -p | grep <my_library_name>

并且,如果缺少任何内容,请根据需要将其添加到/etc/ld.so.conf或ld.so.conf.d /中的新文件中,然后使用

重建
ldconfig -v

当然,如果不需要,则删除SUID位。