在使用aarch64-linux-gnu-gdb調試kernel的時候,執行 aarch64-linux-gnu-gdb ./vmlinux 時,出現了如下錯誤:
aarch64-linux-gnu-gdb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
使用 ldd aarch64-linux-gnu-gdb 命令查看庫的鏈接信息,如下:
linux-vdso.so.1 (0x00007fff4bbe5000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7f81a73000) libncurses.so.5 => not found libtinfo.so.5 => not found libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7f81a50000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7f81901000) libpython2.7.so.1.0 => /lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007f7f8158f000) libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f7f81561000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f7f81538000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7f81346000) /lib64/ld-linux-x86-64.so.2 (0x00007f7f81a98000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7f8132a000) libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f7f81325000)
上面信息顯示 libncurses.so.5 和 libtinfo.so.5 兩個動態庫沒有找到。
情況一:
這時候我們先要使用find命令在文件系統里面找一下libncurses.so.5 和 libtinfo.so.5兩個動態庫是否已經存在,如果不存在,系統是ubuntu的話使用 apt-cache search libncurses* 搜索一下,然后使用 apt-get install $(libname) 安裝一下即可。安裝完以后再使用 ldd aarch64-linux-gnu-gdb 查看所需要的庫是否已經找到,如果都找到了的話,執行 aarch64-linux-gnu-gdb ./vmlinux 時應該不會報錯了。
情況二:
如果文件系統里libncurses.so.5 和 libtinfo.so.5 兩個動態庫已經存在,但是執行 ldd aarch64-linux-gnu-gdb 依然提示沒有找打的話,那應該是文件系統里libncurses.so.5 和 libtinfo.so.5兩個動態庫的路徑沒有在環境變量LD_LIBRARY_PATH里,有兩種方法解決這個問題。
方法一:
也是最簡單的方法,就是把libncurses.so.5* 和 libtinfo.so.5* 拷貝到上面執行 ldd aarch64-linux-gnu-gdb 時顯示被找到的庫的目錄下,我的機器上如上圖所示是 /lib/x86_64-linux-gnu/目錄。這種方法是一勞永逸的。
方法二:
把libncurses.so.5* 和 libtinfo.so.5* 動態庫所在的目錄添加到環境變量LD_LIBRARY_PATH里。
export LD_LIBRARY_PATH=/path_to_lib/:/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH
path_to_lib是文件系統中libncurses.so.5* 和 libtinfo.so.5* 所在的路徑, /lib/x86_64-linux-gnu是aarch64-linux-gnu-gdb所依賴的並且已經找到的其他庫的路徑。