2014-05-01 71 views
0

我已经阅读gdb says "cannot open shared object file"gdb can not open shared object file并按照说明操作。GDB“无法打开共享对象文件”问题

我有一个链接到共享库文件(/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仍然无法找到此共享库中的其他可能的原因是什么?

+2

在这些情况下,它是有用的'strace'。尝试运行'strace -o out.txt gdb。/ myprogram',然后,在发生错误后退出调试器并执行'grep xxx.so out.txt'来查看gdb在哪里查找库。 – rodrigo

+0

@rodrigo:谢谢。我意识到这是因为我在〜/ .cshrc中有一个额外的LD_LIBRARY_PATH目录。在该目录中有一个x64版本库文件(我的应用程序是为x86构建的)。 x64版本文件使GDB抱怨。顺便说一下,strace在这种情况下似乎并不奏效,但并没有显示GDB曾试图访问x64库(但GDB应该这样做)。 – stanleyli

+0

也许gdb分叉。 'strace'默认只跟踪一个进程。你也可以使用'strace -f'来跟踪子进程,看看会发生什么。 – rodrigo

回答

1

然而,当我试图用GDB调试此二进制,GDB说:错误而载入共享库:xxx.so:无法打开共享对象文件:没有这样的文件或目录

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

最常见的原因:你重新设置你的LD_LIBRARY_PATH~/.cshrc和GDB在一个单独的shell中运行你的程序,而且外壳读取您.cshrc,使你的程序使用不正确的环境中执行。

修复方法是为非交互式shell创建.cshrc而不是集合LD_LIBRARY_PATH。见例如this回答。

相关问题