在 Linux 内核编译的“make”步骤中,我收到很多这样的错误:
Building modules, stage 2.
MODPOST 2283 modules
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
我知道我可以做一个make CONFIG_DEBUG_SECTION_MISMATCH=
y 并继续,但我想知道是否有更好的方法来处理这个问题。也许向某人报告或者我自己如何解决这些问题等等。
这只是一个警告。内核构建系统进行了健全性检查并发现了可能存在错误的内容。警告消息表明内核代码中的某处存在可能执行不适当的横截面访问的代码。请注意,您的内核确实已构建!
要了解该警告的含义,请考虑以下示例:
内核文本部分中的某些内核代码可能会尝试调用标有__init
数据宏,链接器将其放入内核中init启动或模块加载后被取消分配的部分。
这可能是一个运行时错误,因为如果text部分调用中的代码init初始化代码完成后的部分,它基本上是调用一个过时的指针。
话虽如此,该调用可能完全没问题 - 内核中的调用可能是这样text部分有充分的理由知道它只调用init部分,当它保证存在时。
当然,这只是一个例子。类似的其他场景也存在。
解决方案是编译CONFIG_DEBUG_SECTION_MISMATCH=y
这将为您提供哪个函数正在尝试访问哪个数据或函数以及它们属于哪个部分的输出。然后,您可以尝试确定构建时间警告是否有必要,如果是的话,希望能够修复。
The init.h https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/init.h macros __ref
and __refdata
可以用来允许这样的init没有警告的参考。例如,
char * __init_refok bar(void)
{
static int flag = 0;
static char* rval = NULL;
if(!flag) {
flag = 1;
rval = init_fn(); /* a function discarded after init */
}
return rval;
}
__init_refok
等可以修复“有效”实例,因此它们存在的事实may不能激发信心。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)