编译内核模块出现CONFIG_DEBUG_SECTION_MISMATCH=y的警告
编写kernel驱动时,出现了如下警告:WARNING: modpost: Found 1 section mismatch(es).为了确实搞清楚问题所在,利用一个简单的例子来说明这里我使用的内核版本是 linux-2.6.32.25其他的版本在编译出错是的提示信息,可能稍微不同。hello.ko的源代码:#include#includes
·
编写kernel驱动时,出现了如下警告:
WARNING: modpost: Found 1 section mismatch(es).
为了确实搞清楚问题所在,利用一个简单的例子来说明
这里我使用的内核版本是 linux-2.6.32.25
其他的版本在编译出错是的提示信息,可能稍微不同。
hello.ko的源代码:
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_INFO " Hello World enter\n");
return 0;
}
static void __exit hello_exit(void) /* 问题所在,具体看下文 */
{
printk(KERN_INFO " Hello World exit\n ");
}
module_init(hello_init);
module_exit(hello_exit);
EXPORT_SYMBOL(hello_init); /* 导出没有 __init 的函数 */
EXPORT_SYMBOL(hello_exit); /* 尝试导出有 __init 标示的函数 */
MODULE_AUTHOR("Jack");
MODULE_LICENSE("Dual BSD/GPL");
/****************************熟悉的分割线********************************/
执行 make 编译时,会出现问题:
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
CC drivers/char/hello.mod.o
LD [M] drivers/char/hello.ko
解决办法:
执行提示的命令:
$ make CONFIG_DEBUG_SECTION_MISMATCH=y
会出现错误的详细信息:
Building modules, stage 2.
MODPOST 133 modules
WARNING: drivers/char/hello.o(__ksymtab+0x0): Section mismatch in reference from the variable __ksymtab_hello_init to the function .init.text:hello_init()
The symbol hello_init is exported and annotated __init
Fix this by removing the __init annotation of hello_init or drop the export. /* 这句指出了解决这个问题的方法 */
去掉"__init",将
static int __init hello_init(void)
改为:
static int hello_init(void)
重新执行 make -j8 编译,使用-j8多线程编译,加快速度,时间珍贵...
Building modules, stage 2.
MODPOST 133 modules
CC drivers/char/hello.mod.o
LD [M] drivers/char/hello.ko
得到了需要的.ko文件,问题解决
WARNING: modpost: Found 1 section mismatch(es).
为了确实搞清楚问题所在,利用一个简单的例子来说明
这里我使用的内核版本是 linux-2.6.32.25
其他的版本在编译出错是的提示信息,可能稍微不同。
hello.ko的源代码:
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_INFO " Hello World enter\n");
return 0;
}
static void __exit hello_exit(void) /* 问题所在,具体看下文 */
{
printk(KERN_INFO " Hello World exit\n ");
}
module_init(hello_init);
module_exit(hello_exit);
EXPORT_SYMBOL(hello_init); /* 导出没有 __init 的函数 */
EXPORT_SYMBOL(hello_exit); /* 尝试导出有 __init 标示的函数 */
MODULE_AUTHOR("Jack");
MODULE_LICENSE("Dual BSD/GPL");
/****************************熟悉的分割线********************************/
执行 make 编译时,会出现问题:
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
CC drivers/char/hello.mod.o
LD [M] drivers/char/hello.ko
解决办法:
执行提示的命令:
$ make CONFIG_DEBUG_SECTION_MISMATCH=y
会出现错误的详细信息:
Building modules, stage 2.
MODPOST 133 modules
WARNING: drivers/char/hello.o(__ksymtab+0x0): Section mismatch in reference from the variable __ksymtab_hello_init to the function .init.text:hello_init()
The symbol hello_init is exported and annotated __init
Fix this by removing the __init annotation of hello_init or drop the export. /* 这句指出了解决这个问题的方法 */
去掉"__init",将
static int __init hello_init(void)
改为:
static int hello_init(void)
重新执行 make -j8 编译,使用-j8多线程编译,加快速度,时间珍贵...
Building modules, stage 2.
MODPOST 133 modules
CC drivers/char/hello.mod.o
LD [M] drivers/char/hello.ko
得到了需要的.ko文件,问题解决
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)