Linux kernel 启用KASLR时,GDB无法正确加载内核符号

Linux kernel 启用KASLR时,GDB无法正确加载内核符号,linux-kernel,gdb,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

启用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
GDB仍然给出错误的符号位置:

% 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) p &jiffies_64
$1 = (u64 *) 0xffffffff81c05000 <jiffies_64>

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

在我看来,调试内核已经够难了,而且每次重新启动时都不会有符号跳舞


也就是说,可能值得考虑将nokaslr传递到您的内核-至少在您调试的时候…

互联网上说,最好的方法是像@ttsiodras所说的那样暂时禁用kaslr。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-@巴特:我谦卑地不同意;这个问题是XY问题的一个例子-所以我提供了一个解决根本问题的答案,这导致了这个问题…@ttsiodras这里没有XY问题。KASLR是使用的合法功能;我自己用它;告诉某人禁用KASLR进行调试并不是一个答案。很抱歉,我来这里寻找答案,但没有找到答案
(gdb) p &jiffies_64
$1 = (u64 *) 0xffffffff81c05000 <jiffies_64>