如何生成Module.symvers?


14

我最近经历了解包内核源rpm离系统(OpenSuse)?; 并且在我的机器上花费了超过10个小时后,想象一下我惊奇的发现,在完成上面描述的过程之后,我什么Module.symvers都找不到!

当我搜索“ generate Module.symvers”时,得到以下信息:

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

...但是我并没有真正理解它-上一步中没有构建内核(在上面的链接中进行了描述吗?我确定知道CC花费超过10小时才能生成一堆* .o文件和LD来链接它们,因此必须已经构建了一些东西,如果是,那么在哪里Module.symvers呢?

用更明确的术语来说,究竟应该调用什么命令来生成Module.symvers?我知道那make prepare将行不通-但是命令将是什么?


仅供参考,在opensuse上,您可以使用Module.symversby zypper install kernel-source,在其他Linux发行版上也可以使用。该文件位于中lib/modules/xxx/build
Syrtis Major

Answers:


16

Module.symvers是生成的,当你(重新)编译模块(重)。运行make modules,您应该Module.symvers在内核树的根目录下得到一个文件。

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


非常感谢@Gilles-从那以后我也找到了答案:Module.symvers文件;并可以确认make modules确实创建了Module.symvers。也感谢您澄清和之间的区别,make以及make modules与之间的关系System.map。干杯!
sdaau

如果机器上没有“ make”怎么办?
bzupnick

3
@bzupnick安装它。它是构建Linux内核模块的必要工具之一。许多软件都需要进行构建。
吉尔斯(Gilles)“所以

我正在尝试从另一台计算机交叉编译LKM。无法在第一个盒子上安装东西。
bzupnick

@bzupnick无论如何,您都需要进行构建。这一切都在构建机器上发生,除了之外,在目标机器上没有任何其他操作insmod
吉尔(Gilles)'所以

4

对于通过搜索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值。


1

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

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

在Ubuntu和其他Debian变体上,该文件将自动找到。但是,如果需要,文件在这里:

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

我找不到linux-headers-$(uname -r)文件夹
King Stone,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.