在启用KASLR的情况下,GDB无法正确加载内核符号

时间:2017-10-13 15:00:20

标签: linux-kernel gdb

启用KASLR后,符号文件和实际符号位置之间将存在偏移。

% cat /proc/kallsyms| grep '\<jiffies_64\>'
ffffffff86805000 D jiffies_64
% objdump -t /usr/lib/debug/boot/vmlinux-4.13.0-1-amd64 | grep '\<jiffies_64\>'
ffffffff81c05000 g     O .data  0000000000000008 jiffies_64

找到.text部分位置,这样我就可以正确加载符号文件:

% cat /proc/kallsyms | grep '\<_text\>'
ffffffff85c00000 T _text

但即使我将符号文件加载到更正位置:

% sudo gdb -c /proc/kcore
GNU gdb (Debian 8.0-1) 8.0
(gdb) add-symbol-file /usr/lib/debug/boot/vmlinux-4.13.0-1-amd64 0xffffffff85c00000
add symbol table from file "/usr/lib/debug/boot/vmlinux-4.13.0-1-amd64" at
    .text_addr = 0xffffffff85c00000
(y or n) y
Reading symbols from /usr/lib/debug/boot/vmlinux-4.13.0-1-amd64...done.

GDB仍然提供错误的符号位置:

(gdb) p &jiffies_64
$1 = (u64 *) 0xffffffff81c05000 <jiffies_64>

如何强制GDB在正确的位置加载符号?

1 个答案:

答案 0 :(得分:0)

以我的拙见,调试内核很难,每次重启时都没有“跳舞”的符号。

也就是说,将nokaslr传递给你的内核也许值得考虑 - 至少在你调试的时候......