【问题标题】:insmod error: inserting './hello.ko': -1 Invalid module format"insmod 错误:插入“./hello.ko”:-1 无效的模块格式”
【发布时间】:2016-03-26 13:02:54
【问题描述】:

我刚刚制作了我的第一个驱动模块,即 LDD3 之后的 hello world 模块。然而不幸遇到了这个错误:

insmod: error inserting './hello.ko': -1 Invalid module format.

我在 Ubuntu 11.04 和我的环境中执行此操作:

$ uname -r
2.6.38-8-generic

我得到这样的内核源代码:

sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.38 - Linux kernel source for version 2.6.38 with Ubuntu patches
$sudo apt-get install linux-source-2.6.38

我的 /usr/src:

$ls /usr/src/
linux-headers-2.6.38-8          linux-source-2.6.38          vboxguest-5.0.10
linux-headers-2.6.38-8-generic  linux-source-2.6.38.tar.bz2

然后我编译内核

$sudo cp /boot/config-2.6.38-8-generic ./.config
$sudo make menuconfig -- load the .config file
$make
$make modules

然后我编译我的内核模块

$make -C /usr/src/linux-source-2.6.38/linux-source-2.6.38 M=`pwd` modules

使用 Makefile:

obj-m := hello.o

最后当我插入模块时:

$sudo insmod hello_world.ko
insmod: error inserting 'hello_world.ko': -1 Invalid module format

我在 dmesg 中发现的:

hello: disagrees about version of symbol module_layout

那么问题出在哪里?

我也注意到linux-header is -2.26.38-generic和源代码版本是-2.26.38,是这个问题吗?但我真的没有在网上找到linux-source-2.26.38-generic 包。

状态更新: 我发现文件 /lib/moduels/$(name -r)/build/Makefile 表明我正在运行的内核版本:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 38
EXTRAVERSION = .2

于是我下载了linux-2.6.38.2并编译,但还是同样的错误。

我也发现/boot/config-$(uname -r)里面有一行:

CONFIG_VERSION_SIGNATURE="Ubuntu 2.6.38-8.42-generic 2.6.38.2"

有人知道这是什么意思吗?我在我正在构建的内核的配置文件中没有看到它。

【问题讨论】:

  • insmod 中的错误表明该模块插入到与编译它的内核不同的内核中。确保您启动的内核与您一直在编译的内核完全相同...
  • @dragosht,您能否指出如何找到我的系统正在运行的确切内核源代码?上面的步骤是我在google上找到的,但是还是不行。
  • uname -r 显示启动的内核并选择特定的内核在启动时按住 shift 键。
  • @roMoon 尝试使用 make -C /usr/src/linux-headers-$(uname -r ) M=pwd` modules` 编译你的模块
  • 感谢@Rusty,使用 -C /usr/src/linux-headers-$(uname -r) 确实有效。另一个问题,ldd3说我需要一个内核源代码树来构建模块,头目录“/usr/src/linux-headers-$(uname -r)”有同样的效果吗?或者我仍然需要构建我的内核源代码树?

标签: linux linux-kernel linux-device-driver embedded-linux kernel-module


【解决方案1】:

构建内核模块的内核和插入模块的内核应该是相同的版本。如果您不想处理这件事,可以使用以下 Makefile。

obj−m += hello−world.o

all:
 make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules
clean:
 make −C /lib/modules/$(shell uname −r)/build M=$(PWD) clean

现在您可以构建并尝试插入模块了。

如果可能的话,我建议你在此行之前成为 root

$sudo cp /boot/config-2.6.38-8-generic ./.config

$su
#cp /boot/config-2.6.38-8-generic ./.config
#insmod hello_world.ko

或者你也可以使用下面的make文件

TARGET  := hello-world
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC      := gcc-3.0

${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
    rm -rf ${TARGET}.o

【讨论】:

  • 事情与“-C /lib/modules/$(shell uname -r)/build”一起工作,但我真的很想知道为什么我编译的内核和我正在运行的内核有不同内核版本。你能给出一些指示吗?
  • 检查 modinfo hello-world.ko ,它会显示你的模块版本,它是从哪个内核构建的。检查您的内核版本。您的内核模块和实际内核版本是否相同?
  • 我的内核版本是 2.26.38-8-generic,我构建模块的内核版本是 2.6.38-8。但是我真的在内核版本中找不到 2.26.38-8-generic 内核源码。
  • 你检查过我建议你的命令吗?我知道您对内核有所了解,但是当您使用命令检查时,您会发现两个版本都会有所不同,因此每当您使用 $(shell uname -r) 时,它都会自动处理这个问题
  • uname -r 命令自动从您正在使用的同一个内核头文件构建模块。您将找不到这个通用版本
【解决方案2】:

尝试使用交叉编译。请查看下面的代码以获取 make 文件。请注意缩进,否则您可能会遇到错误,例如 missing separator. Stop

obj-m += hello_.o #这个名字应该是你的 .c 文件的名字。我只是以你好为例

我建议最好的方法是通过交叉编译

创建一个变量来保存linux内核目录所在的目录名称在我的例子中,将值“PATH_TO_LINUX_KERNEL_DIRECTORY”更改为真实路径值 示例 ~/linux 您确实需要这样做,以便 make 文件知道在哪里可以找到 arm-linux-gnueabi- 如果没有这个,您可能会遇到 arm-linux-gnueabi-

KDIR := PATH_TO_LINUX_KERNEL_DIRECTORY

all:
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -C $(KDIR) M=$(shell pwd) modules

clean:
    make -C $(KDIR) M=$(shell pwd) clean

【讨论】:

    【解决方案3】:

    你做的一切都是正确的,但没有用你编译的内核引导你的系统,所以第一步是你应该用它来引导。 如果您使用的是 Ubuntu,您可以在启动时按住 shift 按钮,您将获得系统中已编译内核的列表,从那里选择 linux-source-2.6.38 然后尝试构建你的模块并用你的方式安装它,你不会发现任何问题。 祝你好运。

    【讨论】:

    • 嗨@Rusty,为什么我必须安装我构建的内核?如果是这样,任何想安装我的内核的人都必须安装我构建的内核?
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多