怎么办“make drivers / usb / storage / usb-storage.ko”

时间:2013-06-28 16:56:00

标签: linux-kernel usb linux-device-driver

如何从内核源代码树编译usb-storage.ko(仅限)?

运行内核版本:2.6.35-22-generic(uname -r)

来源版本:linux-2.6.35

  1. 执行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

  2. 执行insmod会出现以下错误。

    insmod: error inserting 'drivers/usb/storage/usb-storage.ko': -1 Invalid module format

  3. dmesg如下所示。

    usb_storage: no symbol version for module_layout

  4. 如何更改顶级Makefile以将其插入正在运行的内核版本?

    Makefile (顶级)

    VERSION = 2

    PATCHLEVEL = 6

    SUBLEVEL = 35

    EXTRAVERSION =

    NAME = Meth on Meth

1 个答案:

答案 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 文件应该是成功的。