3

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

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

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

这本身就令人困惑,因为 libshared.so 在 LD_LIBRARY_PATH 中。然而,

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

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

我从未见过单独运行与在 strace 中运行时表现不同的应用程序,但我想也许其他人以前见过这种情况?任何想法如何解决这个问题?

我没有源,所以我无法重建。在 strace 下在生产环境中运行该应用程序可能不是一个初学者。操作系统是 RHEL 6.2。

4

1 回答 1

8

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

在新的 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 位。

于 2014-02-14T11:56:53.780 回答