Перехват функции ядра Linux не удается в некоторых случаях?

Я пишу LKM, который перехватывает функцию с помощью пользовательской функции. Для этого я изменяю пролог функции с помощью

mov rax, <custom_func_addr>  // Intel syntax.
jmp rax 

Точный код операции: "\x48\xb8\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe0" // 8 '\x00' are replaced with actual address.
Код работает нормально. Говорят, я подключаю vfs_read (), он работает соответственно.

Я наблюдал один случай, когда перехват не удался:

void foo(char *func) {
    unsigned long addr = get_sym_addr(func);  // gets the address of function.
    DEBUG("function %s addr : %lu\n", func, addr);
    hook((void*)addr, &test_func_hooked);    // hook it with custom function.
    void (*test_func_orig) (int) = addr;     // get ptr to the function.
    test_func_orig(20);                      // call through func ptr.
    test_func(10);                           // call function directly.
}

//  defined in same file.
void test_func(int a) {
    printk("a = %d\n", a);
}  

Однако перехват происходит правильно, когда функция вызывается с использованием func ptr. и, если я вызываю функцию напрямую как - test_func (10), ловушка не вызывается.

Что мне здесь не хватает? Я протестировал модуль, подключив vfs_read (), всякий раз, когда «чтение» приходит к любому файлу, вызывается ловушка. Только в этом конкретном случае, когда функция для перехвата находится в том же файле, он не работает.


1
135