【问题标题】:How to compile a kernel module against a new Source如何针对新源编译内核模块
【发布时间】:2011-11-26 04:19:05
【问题描述】:

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

我的内核是:

2.6.32-34-通用

我给出了以下 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

我的 /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
.......................................................
.......................................................

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

由于它不起作用,我下载了linux-headers-2.6.32-34-generic source from Ubuntu并编译并将我的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

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

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

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

【问题讨论】:

    标签: linux linux-kernel kernel kernel-module


    【解决方案1】:

    错误:

    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.
    

    只是因为你的内核源是新下载的,之前没有编译过。

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

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

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

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

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

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

    obj-m += hello-1.o
    
    default: modules
    
    modules:
    
        make -C /kernel_source/ M=$(PWD) modules
    
    clean:
        make -C /kernel_source/ M=$(PWD) clean
    

    与 Makefile 一起是你的头文件和源文件,它们是 hello-1.c 放在一起的。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:
          1. 检查 /home/james/Desktop/hello/ 目录中是否存在 hello-1.c。
          2. 您需要在内核中启用 modules_enabled。您需要编译一个新内核来执行此操作。 以下帖子解释了如何很好地构建内核。在内核构建配置中启用模块。

            http://kernelnewbies.org/FAQ/KernelCompilation

          【讨论】:

            猜你喜欢
            • 2023-01-09
            • 1970-01-01
            • 2014-04-17
            • 2012-02-22
            • 1970-01-01
            • 2012-02-03
            • 1970-01-01
            • 2011-05-03
            • 1970-01-01
            相关资源
            最近更新 更多