如何从内核源代码树编译usb-storage.ko(仅限)?
运行内核版本:2.6.35-22-generic
(uname -r)
来源版本:linux-2.6.35
执行modprobe usb-storage
会出现以下错误。
FATAL: Error inserting usb_storage (/lib/modules/2.6.35-22-generic/kernel/drivers/usb/storage/usb-storage.ko): Invalid module format
执行insmod
会出现以下错误。
insmod: error inserting 'drivers/usb/storage/usb-storage.ko': -1 Invalid module format
dmesg
如下所示。
usb_storage: no symbol version for module_layout
如何更改顶级Makefile以将其插入正在运行的内核版本?
Makefile (顶级)
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 35
EXTRAVERSION =
NAME = Meth on Meth
答案 0 :(得分:3)
在内核开发过程中,经常会遇到 insmod
本地构建的 ko
模块中的这两个令人沮丧的错误。
错误1:<module-name> no symbol version for module_layout
的为什么吗
这意味着内核源代码 NOT 已构建。构建完整个内核源代码后,将在Linux内核源代码的顶级目录中生成一个文件 Modules.symvers
。这将包含符号 module_layout
的地址。从此以后,这将在构建任何内核模块时使用。
的修复强>
构建完整的内核源代码。确保生成 Modules.symvers
,并且其中包含符号 module_layout
的行。接下来,构建内核模块。
错误2:<module-name> disagrees about version of symbol module_layout
的为什么吗
该错误意味着使用的内核源与用于构建用于引导的内核映像的内核源有很大不同。
的修复强>
手动修改 ko
模块文件,使其与 module_layout
文件中 ko
的值相匹配用于引导的内核映像中的值。
为此,我们首先需要确定 module_layout
的有效值。这基本上存在于系统中存在的每个有效的 ko
文件中。获取此信息的快捷方法来自成功加载的有效 ko
文件。使用 lsmod
获取潜在的“working.ko”文件列表。
# modprobe --dump-modversions <working.ko> | grep module_layout
0x0b11e775 module_layout
# modprobe --dump-modversions <your.ko> | grep module_layout
0x2719d41e module_layout
注意:如果 module_layout
文件中没有 ko
符号的实例,请先按照步骤修复ERROR1,然后再继续操作。
使用您喜欢的十六进制编辑器,使用工作ko文件中的值查找并替换ko文件中的值( 4 字节)。
修改前:
00016c70
的 1e d4 19 27
强> 6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|
修改后:
00016c70
的 75 e7 11 0b
强> 6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|
通过上述更改, insmod
本地构建的 ko
文件应该是成功的。