Leeu365 发表于 2011-02-12 17:34

请大牛解答下Module.symvers文件和CRC值怎么计算的(编译模块到底和哪些环境有关系)

编译内核后会产生Module.symvers这个文件,
这个文件里计算了导出函数的CRC值。


在编译驱动模块时, 会调用srcipt/mod/modpost处理导出函数的CRC值,
见XXX.mod.c文件
static const struct modversion_info ____versions[]
18 __used
19 __attribute__((section("__versions"))) = {
20   { 0x79f0350e, "module_layout" },
21   { 0xadf42bd5, "__request_region" },
22   { 0xcc4e9169, "cdev_del" },
23   { 0xdfead558, "kmalloc_caches" },
24   { 0xeabd7227, "cdev_init" },
25   { 0xb279da12, "pv_lock_ops" },
26   { 0x6980fe91, "param_get_int" },


如果驱动中调用的函数的CRC值和内核中CRC值不相等,就会导致模块加载失败。


请问Module.symvers这个文件是怎么产生的?文件中各函数的CRC值是如何计算出来的?

谢谢!!!

tempname3 发表于 2011-02-12 19:26

没研究过,不过编译模块貌似装与内核版本对应的kernel-devel包就可以了(用RPM的话)。

银河渡口 发表于 2011-02-12 22:52

你的模块是否能够插入与模块依赖符号接口的CRC相关联,简单的说:你的模块依赖funa()函数,如果内核中funa()的参数个数,参数类型,返回值类型等有一点变化,Module.symvers中funa()的CRC就不一样了,你的模就需要重新编译你的内核模块,如果funa()接口没有改变,只是函数体变了,没有问题,CRC不变,内核模块不重新编译也可以插入内核。数据结构同理。

Leeu365 发表于 2011-02-14 09:41

funa()这个函数在哪个文件中? 我怎么没找到呢。

Leeu365 发表于 2011-02-14 09:41

funa()这个函数在哪个文件中? 我怎么没找到呢。

银河渡口 发表于 2011-02-19 13:31

funa() 只是举例,此处是指你的主题帖中的 cdev_init 等函数, 晕倒。。。。。。。。。

nehcc 发表于 2012-09-05 17:00

本帖最后由 nehcc 于 2012-09-05 17:03 编辑

我也迫切想知道 Module.symvers 的 CRC 是怎么算出来的呢 ?


迫切 !


3 楼的说法看似有理,但缺乏证据 !

我发现(不太确定):两个函数一模一样,但导出CRC却不一样了 .....

polejo 发表于 2014-12-26 14:32

IBM developerworks 搜索
《解析Linux内核可装载模块的版本检查机制》
页: [1]
查看完整版本: 请大牛解答下Module.symvers文件和CRC值怎么计算的(编译模块到底和哪些环境有关系)