如何生成Module.symvers?

如何生成Module.symvers?

我最近经历了在系统外解压内核源代码 rpm (OpenSuse)?;由于在我的机器上花费了 > 10 个小时,想象一下我的惊讶之处,在完成那里描述的过程后,我发现没有Module.symvers任何地方!

当我搜索“generate Module.symvers”时,我得到:

注意:即使
设置了 CONFIG_MODVERSIONS,“modules_prepare”也不会构建 Module.symvers;因此,需要
执行完整的内核构建才能使模块版本控制工作。
Linux 内核文档 :: kbuild : module.txt

...但我真的不明白 - 内核不是在上一步中构建的吗(在上面给出的链接中描述?我确信 CC 花费了 > 10 小时来生成一大堆 *.o文件和 LD 来链接它们,所以一定已经构建了一些东西,但如果是这样,那么在哪里Module.symvers

更明确地说,我到底应该调用什么命令来生成 Module.symvers?我知道这make prepare行不通——但是可以的命令是什么?

答案1

Module.symvers您(重新)编译模块时(重新)生成。运行make modules,您应该Module.symvers在内核树的根部获得一个文件。

请注意,如果您只运行make而不运行make modules,则您还没有构建任何模块。来自内核本身(vmlinux或依赖于体系结构的图像格式之一)的符号位于System.map.

答案2

对于那些通过谷歌搜索编译 Derek Molloy 的示例 LKM 时收到的警告而发现此问题的人:您可以简单地使用touch Modules.symvers.如果您的内核不使用modversions(操作系统使用CRC来帮助确保模块与内核匹配)并且您的模块对其他模块没有任何依赖性,那么这足以抑制警告。

WARNING: Symbol version dump ./Module.symvers
         is missing; modules will have no dependencies and modversions.

空文件与 gcc 生成的文件一样好,0x00000000在没有 modversion 的系统上,gcc 只包含具有相同 CRC 值的符号。

答案3

在 CentOS 以及其他 RedHat 变体上,只需提取正在运行的内核的相应文件:

zcat /boot/symvers-$(uname -r).gz > ./Module.symvers

在 Ubuntu 和其他 Debian 变体上,该文件会自动找到。但是,如果您需要它,该文件位于此处:

/usr/src/linux-headers-$(uname -r)/Module.symvers

相关内容