Linux内核CONFIG_DEBUG_SECTION_MISMATCH会出错

use*_*697 15 linux kernel

在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'
Run Code Online (Sandbox Code Playgroud)

我知道我可以做一个make CONFIG_DEBUG_SECTION_MISMATCH=y并继续它,但我想知道是否有更好的方法来处理它.也许向别人报告或我如何解决这些问题,等等.

gby*_*gby 29

这只是一个警告.内核构建系统进行了健全性检查,发现可能存在错误的内容.警告消息在内核代码中的某处显示可能会执行不适当的横截面访问的代码.请注意,您的内核确实构建了!

要了解警告的含义,请考虑以下示例:

内核文本部分中的某些内核代码可能正在尝试调用标记有__init数据宏的函数,链接器将这些函数放入内核init部分,该部分在引导或模块加载后被取消分配.

这可能是一个运行时错误,因为如果文本部分中的代码在初始化代码完成后调用init部分中的代码,它基本上调用一个陈旧的指针.

话虽如此,这个调用可能完全没问题 - 内核文本部分中的调用有可能有一个很好的理由知道它只能在保证存在时调用init部分中的函数.

当然,这只是一个例子.类似的其他场景也存在.

解决方案是使用CONFIG_DEBUG_SECTION_MISMATCH=y它来编译,它将为您输出正在尝试访问哪些数据或函数以及它们属于哪个部分的函数.然后,您可以尝试确定是否需要构建时间警告,以及是否有希望修复.

init.h中__ref__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;
}
Run Code Online (Sandbox Code Playgroud)

__init_refok等等可以修复"有效"实例,因此它们存在的事实可能无法激发信心.