由于某些原因,我从/ proc / kallsyms获得的地址与我使用/ proc / kcore调试正在运行的内核的地址不同。
# uname -a
Linux localhost.localdomain 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
# rpm -ql kernel-debuginfo-3.10.0-862.14.4.el7.x86_64 | grep vmlinux
/usr/lib/debug/lib/modules/3.10.0-862.14.4.el7.x86_64/vmlinux
# gdb -q /usr/lib/debug/lib/modules/3.10.0-862.14.4.el7.x86_64/vmlinux /proc/kcore
Reading symbols from /usr/lib/debug/usr/lib/modules/3.10.0-862.14.4.el7.x86_64/vmlinux...done.
[New process 1]
Core was generated by `BOOT_IMAGE=/vmlinuz-3.10.0-862.14.4.el7.x86_64 root=/dev/mapper/centos-root ro c'.
#0 0x0000000000000000 in irq_stack_union ()
(gdb) p &init_task
$1 = (struct task_struct *) 0xffffffff81c16480 <init_task>
(gdb) quit
# grep "D init_task" /proc/kallsyms
ffffffffa0a16480 D init_task
两个地址当然都是来自同一台计算机,而无需重新启动它。
地址不匹配吗?为什么会发生这种变化?
0xffffffff 81c1 6480
0xffffffff a0a1 6480
答案 0 :(得分:1)
我最终禁用了 KASLR ,在内核命令行中添加了 nokaslr 参数。
但是,即使禁用了 KASLR ,仍然需要修复符号偏移量。正如@Ian在其中一项注释中所建议的那样,我使用了 gdb add-symbol-file 命令。使用文本地址的偏移量加载符号,如下所示:
# grep "D init_task" /proc/kallsyms
ffffffff81c16480 D init_task
# grep " _text" /proc/kallsyms
ffffffff81000000 T _text
# gdb -q -c /proc/kcore
(gdb) add-symbol-file /usr/lib/debug/lib/modules/3.10.0-862.14.4.el7.x86_64/vmlinux 0xffffffff81000000
add symbol table from file "/usr/lib/debug/lib/modules/3.10.0-862.14.4.el7.x86_64/vmlinux" at
.text_addr = 0x81000000
(y or n) y
Reading symbols from /usr/lib/debug/usr/lib/modules/3.10.0-862.14.4.el7.x86_64/vmlinux...done.
(gdb) p &init_task
$1 = (struct task_struct *) 0xffffffff81c16480 <init_task>
它与 gdb 7.6.1 一起使用。
无论如何,知道如何使用KASLR启用功能真是太棒了。