Адреса символов ядра Linux не совпадают между / proc / kcore и / proc / kallsyms - PullRequest
1 голос
/ 09 апреля 2019

По какой-то причине адреса, которые я получаю из / 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

1 Ответ

1 голос
/ 12 апреля 2019

Я закончил тем, что отключил KASLR , добавив параметр nokaslr в командную строку ядра.

Однако, даже если KASLR отключено, все равно необходимо исправить смещения символов. Как предложил @Ian в одном из комментариев, я использовал команду gdb add-symbol-file . Загрузка символов с использованием смещения адреса text следующим образом:

# 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.

...