Shared libraries Linux二进制can';找不到共享库,但在strace中运行时工作

Shared libraries Linux二进制can';找不到共享库,但在strace中运行时工作,shared-libraries,strace,Shared Libraries,Strace,(注意:下面的二进制、二进制和库的名称被混淆以保护无辜者。-)该应用程序是保密协议下的专有应用程序,但其行为可能不依赖于此。) 我有一个Linux二进制文件,在运行时会打印以下错误: binary:加载共享库时出错:libshared.so:无法打开共享对象文件:没有这样的文件或目录 因为libshared.so位于LD_LIBRARY_路径中,所以它本身就令人困惑。但是, 运行ldd binary时,可以正确找到库(即,ldd输出指向文件位置) 运行strace binary时,可以正确找到

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

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

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

因为libshared.so位于LD_LIBRARY_路径中,所以它本身就令人困惑。但是,

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

  • 运行
    strace binary
    时,可以正确找到库,以便程序能够打印其使用信息

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

我没有源代码,因此无法重建。在strace的指导下在生产中运行应用程序可能不是一件容易的事。操作系统是RHEL 6.2。

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

在新的Linux安装中,标准系统运行时链接器不使用LD_LIBRARY_PATH,用于设置了SUID的程序。看来strace、gdb和friends的工作方式不同,它们确实使用LD_LIBRARY_路径

对于suid程序,必须在系统库缓存中找到所有库。使用检查(作为根用户)是否存在“缺失”库

ldconfig -p | grep <my_library_name>

当然,如果不需要,也可以删除SUID位。

有趣!我会追查这是否是最初的问题。出于好奇,您是否有SUID/LD_LIBRARY_路径更改的参考?是的,来自“man LD.so”:使用环境变量LD_LIBRARY_PATH。除非可执行文件是设置用户ID/设置组ID二进制文件,在这种情况下,它将被忽略。非常感谢!节省了我很多时间(还有我的理智:))
ldconfig -v