警告:modpost:发现 10 个部分不匹配

警告:modpost:发现 10 个部分不匹配

我应该担心此错误消息吗?

linux-y3pi:/usr/src/linux-2.6.38.8 # make modules
scripts/kconfig/conf --silentoldconfig Kconfig
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
  CALL    scripts/checksyscalls.sh
  Building modules, stage 2.
  MODPOST 2516 modules
***WARNING: modpost: Found 10 section mismatch(es).***
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'

答案1

来自此 SO Q&A 的纯副本,此问题的解决方案对 U&L 也很有价值!

参考


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

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

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

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

话虽如此,该调用可能完全没问题 - 内核中的调用可能是这样文本部分有充分的理由知道它只调用在里面部分,当它保证存在时。

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

解决方案是使用CONFIG_DEBUG_SECTION_MISMATCH=ywhich 进行编译,将为您提供哪个函数试图访问哪个数据或函数以及它们属于哪个部分的输出。然后,您可以尝试确定构建时间警告是否有必要,如果是的话,希望能够修复。

初始化文件__ref并可__refdata用于允许这样的在里面没有警告的参考。例如,

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等可以修复“有效”实例,因此它们存在的事实可能不能激发信心。

相关内容