前几天,需要在一个内核模块A中添加一个新功能。这个新功能用到了另一个内核模块B中的函数C。我将相关的头文件include之后,加载A模块时,总是出错,说用到的那个函数C找不着。
怎么回事?以前没接触过内核编程的,找了个小牛问了一下,原来是Linux2.6内核不会自动的将非static 函数和变量导入到kernel 空间,需要用到EXPORT_SYMBOL来对函数做一下标记才行。
/* in module B*/
void C()
{
......
}
EXPORT_SYMBOL(C);
/*in module A*/
void func_in_A()
{
extern void c(void);
......
C();
......
}
OK了,这下子编译的时候,虽然还会报warning(不报才怪了),但是insmod时,不会出错了。
上网上找了找别人写的这方面的文章,贴到下面,用得着的朋友,都看看吧,也不用到处找了
一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。
在模块mod1中,EXPORT_SYMBOL(func1);
在模块mod2中,extern int func1();
就可以在mod2中调用func1了。
=================================
EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。
2.6就必须用EXPORT_SYMBOL() 来导出来(因为2.6默认不到处所有的符号)。
1、EXPORT_SYMBOL的作用是什么?