我在尝试为嵌入式系统构建内核和模块时遇到问题。生成的 Module.symvers 具有一些(几十个)条目,其中包含无效的 (0x00000000) CRC 条目。
我试图找出生成 Module.symvers 的过程,以便我可以开始调试有问题的条目。然而,在看了几个小时的构建过程之后,我仍然不明白是什么产生模块.symvers。
注意 - 我正在寻找实际创建 Module.symvers 内容的代码,而不是寻找“制作模块”的指令;-)
我怀疑损坏是由于使用 GCC 6.3 构建 Linux 3.4.12 造成的,但我需要让它使用该配置。禁用 modvers 不是一个选项,因为我需要加载第 3 方二进制 blob 模块。
答案1
该文件Module.symvers
由 生成scripts/modpost
。见开头的评论Makefile.modpost,那些中间的生成文件.build,以及程序本身modpost.c这是使用 options 运行的-m -i
。
使用make modules KBUILD_VERBOSE=1
应该可以让您看到正在使用的命令。
答案2
创建Module.symvers
有多个步骤。这些步骤利用MODVERDIR
(通常.tmp_versions
在构建目录中)包含.mod
文件,
编译模块并.o
生成相应的文件后,将源代码通过 C 预处理器推送,-D__GENKSYMS__
并将结果输出通过管道传输到scripts/genksyms
.genksyms
实现它自己的(相对简单的)代码解析器来生成符号签名及其相应的 CRC。正是该解析器的限制导致genksyms
在内核 3.4 上使用 gcc 6.3 时无法正确解析源代码。 (我通过向后移植内核 4.12 解决了我的问题genksyms
)。genksyms
将为每个模块生成一个.mod.c
包含所有符号 CRC 的文件。然后将其编译以生成.mod.o
文件。
最后一步涉及解析*.mod
中的所有文件MODVERDIR
,检查.ko
组成模块的所有文件,并将相应的.mod.o
文件列表与 一起vmlinux
传递到scripts/modpost
。scripts/modposts
解析目标文件并生成Module.symvers
.