Module.symvers是如何生成的?

Module.symvers是如何生成的?

我在尝试为嵌入式系统构建内核和模块时遇到问题。生成的 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/modpostscripts/modposts解析目标文件并生成Module.symvers.

相关内容