Linux 如何构建内核模块的单个源文件

Linux 如何构建内核模块的单个源文件,linux,linux-kernel,kernel-module,kbuild,Linux,Linux Kernel,Kernel Module,Kbuild,我想将一个.c文件编译成一个.o文件,以便在单独的后期阶段将其与其他文件链接以生成一个可加载的module.ko文件 我试图遵循Kbuilds文档2.4,但没有成功: obj-m: myfile.o all: make -C /lib/modules/$(shell uname -r)/build M=$PWD/ myfile.o 输出为: $ make cc -c -o myfile.o myfile.c myfile.c:42:26: fatal error: linux

我想将一个.c文件编译成一个.o文件,以便在单独的后期阶段将其与其他文件链接以生成一个可加载的module.ko文件

我试图遵循Kbuilds文档2.4,但没有成功:

obj-m: myfile.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$PWD/ myfile.o
输出为:

 $ make
cc    -c -o myfile.o myfile.c
myfile.c:42:26: fatal error: linux/printk.h: No such file or         directory
 #include <linux/printk.h>
                          ^
compilation terminated.
<builtin>: recipe for target 'myfile.o' failed
make: *** [myfile.o] Error 1

首先,由于您在这里遇到了关于头文件的致命问题,所以首先要包括所有必需的头文件

#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */

在所有收据中,而不是myfile.o应该是模块目标。好的,我更改了您所说的所有内容,并将obj-m:myfile.o替换为+=。现在我得到以下错误arch/x86/Makefile:140:CONFIG\ux86\ux32已启用,但没有binutils支持。我想您没有正确安装内核?打开vi/usr/src/linux-4.1.39/arch/x86/+117并检查此目录不存在。不过我有一个64位内核,能够以常规方式构建模块。仅将单个源代码编译成对象会给我带来麻烦:不需要在同一个驱动程序中同时使用init.h和module.h。如果您这样做,则意味着您不熟悉Linux内核。
obj-m += myfile.o
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules