我对此很陌生,刚刚了解内核,我正在尝试添加对内核 4.20.4 的自定义调用。这是我所做的步骤。
- 首先我创建文件(
kernel/printmsg.c
)包含代码。
#include <linux/kernel.h>
#include <linux/syscalls.h>
SYSCALL_DEFINE1(printmsg, int, i)
{
printk(KERN_DEBUG, "TESTING %d", i);
return 1;
}
- 接下来,我将此文件添加到
kernel/Makefile
obj-y = fork.o exec_domain.o panic.o \
// A few more lines
obj-y += printmsg.o // I added this line
- 最后,我将系统调用添加到系统调用表中
arch/x86/entry/syscalls/syscall_64.tbl
(我在 64 位 Ubuntu 上构建它)通过附加以下行:
548 64 printmsg sys_printmsg
现在,我继续运行make
。但是,它有这个错误:
arch/x86/entry/syscall_64.o:(.rodata+0x1120): undefined reference to `sys_printmsg'
Makefile:1034: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1
我为此挠头很长时间,但似乎无法意识到出了什么问题。
希望任何设法找到问题的人都可以帮助一个可怜的灵魂。提前致谢!
好吧,经过几个小时的反复试验,我终于找到了问题所在。从 Linux 内核 v4.17 开始,x86_64 系统调用可能以“__x64_sys”开头。
所以,不要使用548 64 printmsg sys_printmsg
,我把它改成了548 64 printmsg __x64_sys_printmsg
。然后一切正常。
希望这对可能遇到此问题的每个人都有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)