当前位置: 技术问答>linux和unix
使用netlink实现用户态和内核态通信
来源: 互联网 发布时间:2017-03-29
本文导语: 本帖最后由 dengjingen 于 2013-01-14 11:13:04 编辑 我在linux内核中创建netlink和用户态通信,创建函数为nlfd = netlink_kernel_create(&init_net, NL_IMP2, 0, kernel_receive, NULL, THIS_MODULE);但是我编译的时候错误如下:drivers/built-in.o: In ...
(.text+0x375ce): undefined reference to `__this_module'
无论是我创建一个模块,或者是加到已有的模块里面初始化都是这个错误。麻烦大虾指点啊。。。
|
你不是通过insmod加入自己的模块而是在修改源码?
那比较麻烦的,因为THIS_MODULE其实指向的是你通过insmod加入的.ko生成的一个struct module结构,这是在init_module()的load_module()实现的
修改内核的话你可以试试nlfd = netlink_kernel_create(&init_net, NL_IMP2, 0, kernel_receive, NULL, 0);可能会crash
那比较麻烦的,因为THIS_MODULE其实指向的是你通过insmod加入的.ko生成的一个struct module结构,这是在init_module()的load_module()实现的
/* This is where the real work happens */
SYSCALL_DEFINE3(init_module, void __user *, umod,
unsigned long, len, const char __user *, uargs)
{
struct module *mod;
int ret = 0;
/* Must have permission */
if (!capable(CAP_SYS_MODULE) || modules_disabled)
return -EPERM;
/* Only one module load at a time, please */
if (mutex_lock_interruptible(&module_mutex) != 0)
return -EINTR;
/* Do all the hard work */
mod = load_module(umod, len, uargs);
修改内核的话你可以试试nlfd = netlink_kernel_create(&init_net, NL_IMP2, 0, kernel_receive, NULL, 0);可能会crash
|
#define THIS_MODULE ((struct module *)0)这里的0是很有艺术的,这里表达相对(struct module *)结构开始的0地址。你可以通过如下来测试:
struct s
{
char x;
char y;
};
int main()
{
struct s test;
printf ("&test.y=%pn", &test.y);
printf ("&((struct s *)0)->y=%d", int(&((struct s *)0)->y));
return 0;
}
struct s
{
char x;
char y;
};
int main()
{
struct s test;
printf ("&test.y=%pn", &test.y);
printf ("&((struct s *)0)->y=%d", int(&((struct s *)0)->y));
return 0;
}