请大牛解答下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值是如何计算出来的?
谢谢!!! 没研究过,不过编译模块貌似装与内核版本对应的kernel-devel包就可以了(用RPM的话)。 你的模块是否能够插入与模块依赖符号接口的CRC相关联,简单的说:你的模块依赖funa()函数,如果内核中funa()的参数个数,参数类型,返回值类型等有一点变化,Module.symvers中funa()的CRC就不一样了,你的模就需要重新编译你的内核模块,如果funa()接口没有改变,只是函数体变了,没有问题,CRC不变,内核模块不重新编译也可以插入内核。数据结构同理。 funa()这个函数在哪个文件中? 我怎么没找到呢。 funa()这个函数在哪个文件中? 我怎么没找到呢。 funa() 只是举例,此处是指你的主题帖中的 cdev_init 等函数, 晕倒。。。。。。。。。 本帖最后由 nehcc 于 2012-09-05 17:03 编辑
我也迫切想知道 Module.symvers 的 CRC 是怎么算出来的呢 ?
迫切 !
3 楼的说法看似有理,但缺乏证据 !
我发现(不太确定):两个函数一模一样,但导出CRC却不一样了 ..... IBM developerworks 搜索
《解析Linux内核可装载模块的版本检查机制》
页:
[1]