Как вызвать исходную функцию в живом патче?Linux

Ответить
Anonymous
 Как вызвать исходную функцию в живом патче?

Сообщение Anonymous »


Я хочу изменить параметры, передаваемые в функцию ядра, с помощью живых патчей, но без изменения логики функции. Ссылаясь на пример Livepatch, предположим, что исходная функция — это func_old(int a), а новая функция — func_new(int a).

Если я вызываю старую функцию непосредственно в новой функции, например:

void func_new(int a){ интервал б = а+1; func_old (б); } Будут ли происходить бесконечные рекурсивные вызовы? Как следует избегать такой ситуации?

func_old не виден патчу и вызовет ошибку «неявного объявления функции». Как этого можно было избежать?

Я попробовал использовать следующий метод, но система зависла после вызова cat /proc/cmdline.
#include static int (*real_cmdline_proc_show)(struct seq_file *m, void *v); static int fh_cmdline_proc_show (struct seq_file *m, void *v) { интервал врет; seq_printf(m, "%s\n", "это было перехвачено ftrace"); ret = real_cmdline_proc_show(m, v); pr_debug("cmdline_proc_show() возвращает: %ld\n", ret); вернуть возврат; } статическая структура klp_func funcs[] = { { .old_name = "cmdline_proc_show", .new_func = fh_cmdline_proc_show, }, { } }; статическая структура klp_object objs[] = { { /* имя NULL означает vmlinux */ .funcs = функции, }, { } }; статическая структура klp_patch patch = { .mod = ЭТОТ_МОДУЛЬ, .objs = объекты, }; статический int livepatch_init (недействительный) { int result = klp_enable_patch(&patch); int (*real_cmdline_proc_show)(struct seq_file *m, void *v) = funcs[0].old_func; вернуть результат } статическая пустота livepatch_exit(void) { } Module_init (livepatch_init); модуль_exit (livepatch_exit); MODULE_LICENSE("GPL"); MODULE_INFO(живое обновление, "Y");
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»