启用KASLR后,符号文件与实际符号位置之间会有偏移。启用KASLR后,GDB无法正确载入内核符号
% 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在正确的位置加载符号?
互联网说,最好的办法是暂时关闭'kaslr'就像@ttsiodras说过。 –