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
How to compile a kernel module against a new Source
提问by user567879
I am trying to compile a Hello World
module. 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-generic
exists.
文件夹/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
- Check if hello-1.c exists in /home/james/Desktop/hello/ directory.
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.
- 检查 /home/james/Desktop/hello/ 目录中是否存在 hello-1.c。
您需要在内核中启用 modules_enabled。你需要编译一个新的内核来做到这一点。以下帖子解释了如何很好地构建内核。在内核构建的配置中启用模块。
回答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”即可成功生成内核模块。