我一直在按照本指南使用 gdb 和 VMWare 设置一个 Linux 内核调试环境。 一切都进行得很顺利,直到那部分:
将 GDB 连接到调试对象
我们还无法从加载的内核模块中看到符号。我们将加载帮助程序脚本,然后运行 lx 符号,这将探测加载的模块并适当地配置 GDB:(gdb) source home/alambert/kernel/source/linux-4.13.0/debian/build/build-generic/vmlinux-gdb.py
(gdb) lx-symbols
在我的系统上运行它时,我收到以下python错误:pwndbg> source /home/user/kernel/source/linux-4.4.0/debian/build/build-generic/vmlinux-gdb.py
pwndbg> lx-symbols
loading vmlinux
Python Exception <class 'gdb.error'> There is no member named module_core.:
Error occurred in Python command: There is no member named module_core.
我的设置
调试器和调试对象计算机都是虚拟机,调试对象是 Ubuntu 16.04,调试器是 Ubuntu 18.04。
调试对象:$ cat /proc/version
Linux version 4.4.0-134-generic (buildd@lgw01-amd64-033) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #160-Ubuntu SMP Wed Aug 15 14:58:00 UTC 2018
调试器:$ cat /proc/version
Linux version 4.15.0-34-generic (buildd@lgw01-amd64-047) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018
$ gdb --version
GNU gdb (GDB) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ python -V
Python 2.7.15rc1
我最初认为这是一个 python3/2 兼容性问题,所以我用 python 2.7 重新编译了 gdb,但得到了完全相同的错误。
我还验证了这不是一个pwndbg
问题 - 我用香草 gdb 尝试了这个,效果完全相同。
我已经验证了python帮助程序脚本是在编译调试内核的过程中创建的。我实际上让整个构建过程完成,而不是像指南建议的那样在创建脚本后停止它 - 只是为了确保所有脚本都到位。
我尝试在线查找错误,但似乎没有任何提及。
有人遇到过这个问题吗?
在对脚本和 Linux 内核的来源进行一些挖掘后,我设法解决了这个问题。
问题在于此提交,它将module_core
指针替换为include/linux/module.h
标头中的module_layout
结构。该更改显然已拉入内核 4.4.0,但直到更高版本才在帮助程序脚本中考虑。
这在一段时间后得到了处理(特别是 - 在此提交中(,因此 4.4.0 和 4.6-rc1 之间的所有内核版本都会有此错误。
解决方案是从上述提交中下载脚本并将它们放在相关目录中。
这当然是一个罕见的边缘情况,但我希望这个答案有一天会对某人有所帮助。