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

Aqu*_*irl 6 linux compiling kernel

这个错误信息是我应该担心的吗?

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

slm*_*slm 1

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

参考


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

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

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

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

话虽如此,该调用可能完全没问题 - 内核文本部分中的调用可能有一些充分的理由知道它仅在保证存在时才调用init部分中的函数。

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

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

init.h宏可用于允许此类init引用而不发出警告。例如,__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;
}
Run Code Online (Sandbox Code Playgroud)

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