GDB“无法打开共享对象文件”问题

Posted

技术标签:

【中文标题】GDB“无法打开共享对象文件”问题【英文标题】:GDB "cannot open shared object file" Issue 【发布时间】:2014-05-01 00:27:59 【问题描述】:

我已经阅读了gdb says "cannot open shared object file" 和gdb can not open shared object file 并按照说明进行操作。

我有一个链接到共享库文件 (/zzz/yyy/xxx.so) 的二进制文件。在我将LD_LIBRARY_PATH 设置为/zzz/yyy/ 并在没有GDB 的情况下运行二进制文件后,它执行得非常好。

但是,当我尝试使用 GDB 调试这个二进制文件时,GDB 说:

error while loading shared libraries: xxx.so: cannot open shared object file: No such file or directory

我已经有了(在 .gdbinit 中设置):

(gdb)show env LD_LIBRARY_PATH
LD_LIBRARY_PATH = "/zzz/yyy/"

(gdb) show solib-search-path
The search path for loading non-absolute shared library symbol files is "/zzz/yyy/".

在我的系统中:

% printenv LD_LIBRARY_PATH
/zzz/yyy

GDB 仍然找不到这个共享库的其他可能原因是什么?

【问题讨论】:

在这些情况下,strace 很有用。尝试运行strace -o out.txt gdb ./myprogram,然后在错误发生后退出调试器并执行grep xxx.so out.txt 以查看gdb 在哪里寻找库。 @rodrigo:谢谢。我意识到这是因为我在 ~/.cshrc 中有一个额外的 LD_LIBRARY_PATH 目录。该目录中有一个 x64 版本的库文件(我的应用程序是为 x86 构建的)。 x64 版本文件使 GDB 抱怨。顺便说一句,在这种情况下,strace 似乎效果不佳,它没有表明 GDB 曾尝试访问 x64 库(但 GDB 应该这样做)。 可能是 gdb 分叉。 strace 默认只跟踪一个进程。您也可以使用strace -f 来跟踪子进程,看看会发生什么。 【参考方案1】:

但是,当我尝试使用 GDB 调试此二进制文件时,GDB 显示:加载共享库时出错:xxx.so:无法打开共享对象文件:没有这样的文件或目录

你错了:不是 GDB 这么说的,而是动态加载器。 GDB 本身并不关心LD_LIBRARY_PATH 的设置,它只是运行您的程序。但是你的程序无法运行。

最常见的原因:您在~/.cshrc 中重新设置了LD_LIBRARY_PATH,而GDB 在单独的shell 中运行您的程序,而该shell 读取了您的.cshrc,因此您的程序在不正确的环境下执行。

解决方法是让.cshrc not 为非交互式 shell 设置 LD_LIBRARY_PATH。参见例如this答案。

【讨论】:

以上是关于GDB“无法打开共享对象文件”问题的主要内容,如果未能解决你的问题,请参考以下文章

Roslaunch 无法打开共享对象文件:没有这样的文件或目录

运行 kivy 示例时无法打开共享对象文件

libz.so.1:无法打开共享对象文件

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

libcrypto.so.0.9.7:无法打开共享对象文件

加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)