当前位置: 技术问答>linux和unix
内核中全局变量的问题
来源: 互联网 发布时间:2016-11-26
本文导语: 本帖最后由 gg297231604 于 2010-05-25 08:40:49 编辑 我需要在内核中设定一个全局变量,在模块中能够使用它 我在内核代码中的一个C文件定义它: int hidden_flag = 0; EXPORT_SYMBOL(hidden_flag); 然后在模块中声明了 extern int hidden...
我在内核代码中的一个C文件定义它:
int hidden_flag = 0;
EXPORT_SYMBOL(hidden_flag);
然后在模块中声明了
extern int hidden_flag;
但编译模块是却提示‘hidden_flag’未定义
另外,在编译内核时,也有几个警告:
警告:数据定义时没有类型或存储类
警告:在‘EXPORT_SYMBOL’的声明中,类型默认为‘int’
警告:函数声明中出现形参名却未指定类型
如果是在模块中定义并调出,编译加载后,用另一个模块调用却没问题
为什么在内核中却不行呢?请大家指点
|
EXPORT_SYMBOL可以导出变量吗?印象中是用来导出函数的..
|
其实就是内核与模块之间的交互问题。
姑且不论内核中的全局变量模块能不能用,这种做法本身并不标准,设计上应该尽量减少全局变量的使用。
比较标准的做法是嵌在具体的设备节点的ioctl操作中,或者借助proc文件系统,或者借助一些成熟的配置交互框架。
姑且不论内核中的全局变量模块能不能用,这种做法本身并不标准,设计上应该尽量减少全局变量的使用。
比较标准的做法是嵌在具体的设备节点的ioctl操作中,或者借助proc文件系统,或者借助一些成熟的配置交互框架。
|
你只是声明,没有定义啊
int hidden_flag;
extern去掉.
|
你需要在某个地方定义这个变量先 然后再extern 出来
extern 和 EXPORT_SYMBOL并没有帮你定义这个变量
extern 和 EXPORT_SYMBOL并没有帮你定义这个变量
|
只能是EXPORT_SYMBOL(hidden_flag);出了问题了。
|
Linux symbol export method:
[1] If we want export the symbol in a module, just use the EXPORT_SYMBOL(xxxx) in the C or H file.
And compile the module by adding the compile flag -DEXPORT_SYMTAB.
Then we can use the xxxx in the other module.
[2] If we want export some symbol in Kernel that is not in a module such as xxxx in the /arch/ppc/fec.c.
Firstly, define the xxxx in the fec.c;
Secondly, make a new file which contain the "extern" define the xxxx(for example, extern int xxxx);
Lastly, in the ppc_ksyms.c we includes the new file, and add the EXPORT_SYMBOL(xxxx).
Then we can use the xxxx.
[1] If we want export the symbol in a module, just use the EXPORT_SYMBOL(xxxx) in the C or H file.
And compile the module by adding the compile flag -DEXPORT_SYMTAB.
Then we can use the xxxx in the other module.
[2] If we want export some symbol in Kernel that is not in a module such as xxxx in the /arch/ppc/fec.c.
Firstly, define the xxxx in the fec.c;
Secondly, make a new file which contain the "extern" define the xxxx(for example, extern int xxxx);
Lastly, in the ppc_ksyms.c we includes the new file, and add the EXPORT_SYMBOL(xxxx).
Then we can use the xxxx.
|
楼主的方法应该没有问题,把内核清除重新编译一下,看看
|
问题的真正原因是由于你在编译内核时的Makefiel中没有加入一个宏定义-DEXPORT_SYMTAB,解决方法是在内核根目录下的Makefile的
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
后面增加-DEXPORT_SYMTAB即可。
如果是编译模块那么可以在Makefile中手动添加-DEXPORT_SYMTAB即可。
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
后面增加-DEXPORT_SYMTAB即可。
如果是编译模块那么可以在Makefile中手动添加-DEXPORT_SYMTAB即可。