2014-05-01 182 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回答。

相關問題