2

如何从内核源代码树编译 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

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

Makefile(顶层)

版本 = 2

补丁级别 = 6

次等级 = 35

外向 =

名称 = 吸毒绵羊

4

1 回答 1

4

insmod在内核开发过程中,在本地构建ko模块时经常会遇到这两个令人沮丧的错误。


错误1:<module-name> no symbol version for module_layout

为什么?
这意味着未构建内核。一旦构建了整个内核源代码,Modules.symvers就会在 Linux Kernel 源代码的顶级目录中生成一个文件。这将包含符号的地址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 文件中的值(4个字节)并将其替换为工作 ko 文件中的值。

修改前:
00016c701e d4 19 276d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|

修改后:
00016c7075 e7 11 0b6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|


通过上述更改,insmod本地构建的ko文件应该是成功的。

于 2013-07-02T10:01:59.160 回答