启用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在正确的位置加载符号?
答案 0 :(得分:0)
以我的拙见,调试内核很难,每次重启时都没有“跳舞”的符号。
也就是说,将nokaslr
传递给你的内核也许值得考虑 - 至少在你调试的时候......