【问题标题】:Error in make file for device driver Hello world设备驱动程序 Hello world 的 make 文件出错
【发布时间】:2015-02-05 20:54:19
【问题描述】:

我有一个简单的代码,带有设备驱动程序 hello world 和一个 make 文件。它在 12.04 LTS 的情况下执行得很好,但最近我已经将我的 ubuntu 升级到 14.04 之后,相同的程序无法编译。

上有错误消息
make

make -C /lib/modules/3.13.0-45-generic/build M= modules
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-45-generic'
make[2]: *** No rule to make target `/usr/src/linux-headers-3.13.0-45-generic/arch/x86/syscalls/syscall_32.tbl', needed by `arch/x86/syscalls/../include/generated/uapi/asm/unistd_32.h'.  Stop.
make[1]: *** [archheaders] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-45-generic'
make: *** [all] Error 2

提前致谢......

【问题讨论】:

    标签: c linux linux-kernel makefile linux-device-driver


    【解决方案1】:

    您的 make 文件不适用于其他版本的内核,因为内核库模块将位于 /lib/modules/kernelversion/build 中。

    所以你应该使用 make -C /lib/modules/"应该是当前运行的内核"/build

    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    

    这将使用“shell uname -r”自动加载当前运行的内核版本。

    生成文件示例

    KERNELDIR := /lib/modules/$(shell uname -r)/build
    CLEANFILE := *.dis *.o *.ko *.mod.* *.symvers *.*.old
    obj-m := hello.o
    
        default:
                make -C $(KERNELDIR)  M=$(CURDIR) modules
    
        clean:
                rm -f $(CLEANFILE) 
    
    【解决方案2】:

    您应该在问题中发布 Makefile 的内容。 无论如何,我认为您的 Makefile 中存在一些问题。不要将内核版本指定为 3.13.0-45-generic ,而应编写 $(shell uname -r) 以便它可以动态获取当前运行的内核版本。随着升级 ubuntu,您的内核版本发生了变化。所以,它不再工作了。

    如果您的设备驱动程序文件名为 hello.c

    ,请按如下方式创建您的 Makefile
    obj-m += hello.o
    all:
        make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) modules
    clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) clean
    

    make”命令的执行首先将其目录更改为 -C 选项提供的目录,即 /lib/modules/$(shell uname -r)/build 这是您的内核源目录,而 M= 选项会导致 makefile 移回您的模块源目录,因为 CURDIR(current directory) 始终设置为当前工作目录。

    如果仍然无法正常工作,请回复。如果您是该领域的初学者,This pdf 可以帮助您作为快速参考。如果你以后想成为 linux 设备驱动编程专家,请关注This Book。值得一读。

    【讨论】:

    • 你为什么不定义PWD?
    • 您不需要定义 PWD。它总是自动定义为环境变量。这个 'make' 命令首先将其目录更改为 -C 选项提供的目录(即您的内核源目录),然后 M= 选项使该 makefile 移回您的模块源始终由 PWD 自动定义的目录。您可以通过在终端上抛出 pwd 命令来检查 PWD 的值。
    • 请不要使用PWD,而是使用CURDIRPWD 是一个不会传递给 sudo 的环境变量。所以如果你想安装你的模块,这就成了一个问题。事实上,由于 OP 的“M=”没有参数,他甚至很可能使用了从互联网复制的 PWDmaked 和 sudoCURDIR 是一个 GNU 扩展(这没关系,因为内核 Makefiles 无论如何都是 GNU),它总是保证设置。 Read google.
    • 使用 PWD 在这里不会产生任何问题,因为我之前已经创建了自己的设备驱动程序。 insmoding 和 sudo 每次都安装了模块,没有任何故障。但是,你的建议是足够合理的。所以,我正在编辑我的答案。谢谢。
    • @SurajeetBharati,当然。不过,我不是在谈论 insmod,我是在谈论将模块与内核中的其他模块一起安装,并使用内核 Makefile 的 modules_install 目标。
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多