Linux内核CONFIG_DEBUG_SECTION_MISMATCH会出错

时间:2011-07-24 15:36:54

标签: 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'

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

1 个答案:

答案 0 :(得分:29)

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

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

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

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

话虽如此,那个调用可能非常好 - 内核 text 部分中的调用有可能知道它只调用 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;
}

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