一、module.symvers文件格式
module.symvers文件是用于内核模块构建的一种中间文件,包含了内核符号表中的所有符号,在编译内核模块时会与当前内核的符号表进行比较,以便找出需要的符号。module.symvers文件一般在内核源代码树下的 Module.symvers 文件中,其格式如下:
EXPORT_SYMBOL_GPL(sym)
其中 EXPORT_SYMBOL_GPL 是内核模块中定义符号的宏,sym 是符号的名称。例如:EXPORT_SYMBOL_GPL(mycustom_function)。
二、module.symvers文件为0kb原因分析
在构建内核模块时,可能会遇到 module.symvers 文件为0kb的情况。这种情况发生的原因往往是因为构建内核时未开启 CONFIG_MODVERSIONS 选项,导致无法生成符号版本信息。此时可按以下步骤进行修复:
1、在内核源代码树下执行 make oldconfig 命令,以便重新配置内核。
make oldconfig
2、进入内核配置菜单,开启 CONFIG_MODVERSIONS 选项。
make menuconfig
3、重新编译内核。
make -j4 make modules_install make install
三、module.symvers的作用
module.symvers 文件的作用主要有以下两个方面:
1、编译内核模块时,module.symvers 文件用于与当前内核的符号表进行比较,以便找出需要的符号。
2、module.symvers 文件还被用于内核签名, 每个内核模块都必须被签名,以确保内核模块来自受信任的源头。
四、如何生成module.symvers文件
1、在内核源代码树下执行 make prepare 命令。
make prepare
2、在内核源代码树下执行 make script symvers 命令,以便生成 module.symvers 文件。
make scripts make symvers
3、请注意,只有开启了 CONFIG_MODVERSIONS 选项,才能成功生成 module.symvers 文件。
五、使用module.symvers文件
在内核模块编写过程中,module.symvers 文件用于指定需要与内核符号表进行比较的符号。具体步骤如下:
1、在内核模块代码中使用 EXPORT_SYMBOL_GPL 宏,声明需要导出的符号。
EXPORT_SYMBOL_GPL(mycustom_function);
2、编译内核模块时,使用 -C 选项指定当前内核源码路径。使用 -I 选项指定内核头文件路径。
make -C /path/to/kernel/source M=$PWD modules
3、编译内核模块时,使用 -I 选项指定当前内核的符号表路径。
make -C /path/to/kernel/source M=$PWD modules KBUILD_EXTRA_SYMBOLS=/path/to/kernel/symbols/module.symvers
六、结论
module.symvers 文件作为内核模块构建的一个关键中间文件,包含了内核符号表中的所有符号,在编译内核模块时起到了至关重要的作用。当出现 module.symvers 文件为0kb的情况时,需要检查是否开启了 CONFIG_MODVERSIONS 选项,并进行修复。在内核模块编写阶段,使用 module.symvers 文件与内核符号表进行比较,以找出需要的符号,有助于提高内核的安全性和可维护性。
原创文章,作者:ICCH,如若转载,请注明出处:https://www.506064.com/n/145894.html