Я пытаюсь напечатать первый байт, если функция в ядре. Я хочу напечатать функцию «filldir». Я нашел его в ядре, используя / proc / kallsyms
это код (адрес ffffffff812e6020
) -
ffffffff812e6020: e8 0b b9 91 00 callq 0xffffffff81c01930
ffffffff812e6025: 55 push %rbp
ffffffff812e6026: 48 89 e5 mov %rsp,%rbp
ffffffff812e6029: 41 57 push %r15
Я нашел тот же адрес (я так думаю), используя этот код в моем модуле ядра -
typedef unsigned long psize;
(psize *) filldir;
filldir= (void *)kallsyms_lookup_name("filldir");
printk("rooty: sys_call_table found at %p\n", filldir);
и получил - 000000001663973a
, я не знаю, почему есть разница, я попытался привести его к long
и unsigned long
, но результат тот же.
поэтому мой первый вопрос : почему есть разница? Я почти уверен, что это тот же адрес, который напечатан по-другому ... как я могу получить правильное значение?
Мой второй вопрос , я пытаюсь напечатать первый байт функции (e8
), но я понятия не имею, как это сделать.
я попробовал эти варианты -
printk("%x", *filldir);
printk("%x", *(unsigned char*)filldir);
printk("%x", (unsigned char*)filldir[0]);
, но ни один из них не сработал, никогда не получал e8
.
Как я могу напечатать первый байт функция, когда у меня есть указатель на функцию?