Linux 如何针对新源编译内核模块

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8276245/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 02:34:51  来源:igfitidea点击:

How to compile a kernel module against a new Source

linuxlinux-kernelkernelkernel-module

提问by user567879

I am trying to compile a Hello Worldmodule. I am having a fresh Ubuntu in my system which doesn't have any compiled kernel.

我正在尝试编译一个Hello World模块。我的系统中有一个新的 Ubuntu,它没有任何编译的内核。

My kernel is:

我的内核是:

2.6.32-34-generic

2.6.32-34-通用

I gave the following Makefile and got the error:

我给出了以下 Makefile 并得到了错误:

obj-m += hello-1.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

# make
make -C /lib/modules/2.6.32-34-generic/build M=/home/james/Desktop/hello modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-34-generic'
make[2]: *** No rule to make target `/home/james/Desktop/hello/hello-1.c', needed by `/home/james/Desktop/hello/hello-1.o'.  Stop.
make[1]: *** [_module_/home/james/Desktop/hello] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-34-generic'
make: *** [all] Error 2

The contents of my /lib/modules/2.6.32-34-generic are

我的 /lib/modules/2.6.32-34-generic 的内容是

total 3864
lrwxrwxrwx  1 root root     40 2011-11-05 15:55 build -> /usr/src/linux-headers-2.6.32-34-generic
drwxr-xr-x  2 root root   4096 2011-11-05 15:49 initrd
drwxr-xr-x 10 root root   4096 2011-11-05 15:49 kernel
.......................................................
.......................................................

The folder /usr/src/linux-headers-2.6.32-34-genericexists.

文件夹/usr/src/linux-headers-2.6.32-34-generic存在。

Since it didnt work, I downloaded the linux-headers-2.6.32-34-generic source from Ubuntuand compiled and changed my Makefile to:

由于它不起作用,我从 Ubuntu下载了linux-headers-2.6.32-34-generic 源并编译并将我的 Makefile 更改为:

obj-m += hello-1.o
all:
    make -C /usr/src/linux-2.6.32/ M=$(PWD) modules

clean:
    make -C /usr/src/linux-2.6.32/ M=$(PWD) clean

#make
make -C /usr/src/linux-2.6.32/ M=/home/james/Desktop/hello modules
make[1]: Entering directory `/usr/src/linux-2.6.32'

  ERROR: Kernel configuration is invalid.
         include/linux/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.


  WARNING: Symbol version dump /usr/src/linux-2.6.32/Module.symvers
           is missing; modules will have no dependencies and modversions.

make[2]: *** No rule to make target `/home/james/Desktop/hello/hello-1.c', needed by `/home/james/Desktop/hello/hello-1.o'.  Stop.
make[1]: *** [_module_/home/james/Desktop/hello] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.32'
make: *** [all] Error 2

Could someone help me solving this.http://packages.ubuntu.com/lucid-updates/devel/linux-headers-2.6.32-34-generic

有人可以帮我解决这个问题吗?http://packages.ubuntu.com/lucid-updates/devel/linux-headers-2.6.32-34-generic

I have some general questions to ask.

我有一些一般性的问题要问。

After a fresh install what is the best way of compiling a kernel. After I compiled the kernel and built a module it worked flawlessly earlier. But I couldnt know what to do this in this situation

全新安装后,编译内核的最佳方法是什么。在我编译内核并构建了一个模块后,它更早地工作得很好。但我不知道在这种情况下该怎么做

采纳答案by Praveen Felix

make[2]: *No rule to make target /home/james/Desktop/hello/hello-1.c', needed by/home/james/Desktop/hello/hello-1.o'. Stop

make[2]: *没有规则可以制作目标 /home/james/Desktop/hello/hello-1.c', needed by/home/james/Desktop/hello/hello-1.o'。停止

Your are facing this error in the first compilation because hello-1.cfile is missing in /home/james/Desktop/hello/directory.

您在第一次编译时遇到此错误,因为/home/james/Desktop/hello/目录中缺少hello-1.c文件。

回答by Cong Wang

You need to install some package like 'kernel-devel' on Fedora (sorry I am not a Ubuntu user), it provides the headers and .config to compile your kernel module.

你需要在 Fedora 上安装一些像 'kernel-devel' 这样的包(抱歉我不是 Ubuntu 用户),它提供了头文件和 .config 来编译你的内核模块。

回答by teardrop

  1. Check if hello-1.c exists in /home/james/Desktop/hello/ directory.
  2. You need to have modules_enabled in your kernel. You need to compile a fresh kernel to do this. Following post explains how to build kernel nicely. Enable modules in configuration of kernel build.

    http://kernelnewbies.org/FAQ/KernelCompilation

  1. 检查 /home/james/Desktop/hello/ 目录中是否存在 hello-1.c。
  2. 您需要在内核中启用 modules_enabled。你需要编译一个新的内核来做到这一点。以下帖子解释了如何很好地构建内核。在内核构建的配置中启用模块。

    http://kernelnewbies.org/FAQ/KernelCompilation

回答by Peter Teoh

The error:

错误:

ERROR: Kernel configuration is invalid.
         include/linux/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.


  WARNING: Symbol version dump /usr/src/linux-2.6.32/Module.symvers
           is missing; modules will have no dependencies and modversions.

simply is because your kernel source is newly downloaded and uncompiled before.

只是因为您的内核源代码是新下载的并且之前未编译过。

This is how u should compile any kernel module.

这就是你应该如何编译任何内核模块。

After download the kernel source, you must prepare it for adding any modules to it.

下载内核源代码后,您必须准备好向其中添加任何模块。

Copy the older-kernel's "config-xxxx" file from the /boot/ directory into the new kernel source directory, and rename it as ".config".

将旧内核的“config-xxxx”文件从 /boot/ 目录复制到新内核源目录中,并将其重命名为“.config”。

Then execute "make oldconfig", which will take a backup of the .config into .config.old, and regenerate a new .config based on the new kernel source. Just enter "ENTER" for all the default settings (lots of them).

然后执行“make oldconfig”,这会将 .config 备份到 .config.old 中,并基于新的内核源重新生成一个新的 .config。只需为所有默认设置(很多)输入“ENTER”。

Next is to do a "make" (and wait for some time) - it will generate a new kernel file "vmlinux", together with many other files which is read by the modules compilation process.

接下来是做一个“make”(并等待一段时间)——它将生成一个新的内核文件“vmlinux”,以及模块编译过程读取的许多其他文件。

Now you can go to your directory where the kernel module source code is located, and based on the following Makefile:

现在您可以转到内核模块源代码所在的目录,并基于以下 Makefile:

obj-m += hello-1.o

default: modules

modules:

    make -C /kernel_source/ M=$(PWD) modules

clean:
    make -C /kernel_source/ M=$(PWD) clean

Together with Makefile are your header and source file, which is hello-1.c located together.

与 Makefile 一起的是您的头文件和源文件,即 hello-1.c 位于一起。

Just "make" and your kernel modules should be generated successfully.

只需“make”即可成功生成内核模块。