如何从内核源代码树编译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 (顶级)
版本= 2
PATCHLEVEL = 6
SUBLEVEL = 35
EXTRAVERSION =
NAME = Meth上的绵羊
1 回答
在内核开发期间,在本地构建的 ko 模块上经常会遇到这两个令人沮丧的错误 .
Error1: <module-name> no symbol version for module_layout
Why?
这意味着内核源代码是 NOT . 构建完整个内核源代码后,将在Linux内核源代码的顶级目录中生成一个文件 Modules.symvers . 这将包含符号 module_layout 的地址 . 从此以后,这将在构建任何内核模块时使用 .
Fix
构建完整的内核源代码 . 确保生成 Modules.symvers 并且它包含符号 module_layout 的行 . 在此之后,构建内核模块 .
Error2: <module-name> disagrees about version of symbol module_layout
Why?
该错误意味着正在使用的内核源与用于构建用于引导的内核映像的内核源有很大不同 .
Fix
手动修改 ko 模块文件,使 ko 文件中 module_layout 的值与用于引导的内核映像中的值相匹配 .
为此,我们首先需要确定 module_layout 的有效值 . 这基本上存在于系统中存在的每个有效工作 ko 文件中 . 获取此信息的快速方法是从成功加载的有效 ko 文件中获取 . 使用 lsmod 获取潜在的"working.ko"文件列表 .
注意:如果 ko 文件中没有 module_layout 符号的实例,则在继续执行下面之前,首先按照步骤修复ERROR1 .
使用您喜欢的十六进制编辑器,使用工作ko文件中的值查找并替换ko文件中的值( 4 bytes) .
修改前:
00016c70
1e d4 19 276d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|
修改后:
00016c70
75 e7 11 0b6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|
通过上述更改, insmod 本地构建的 ko 文件应该是成功的 .