我最近经历了在系统外解压内核源代码 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