我目前正在开发一个简单的 Linux 内核模块,并且遇到了与运行 make 和 sudo make 命令相关的问题。这是我的 Makefile 的内容:
obj-m := main.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 时,编译过程完美运行。但是,当我尝试 sudo make 时,$(PWD) 命令似乎失败,导致错误。 pwd 是一个环境变量,即使在 shell 中以 root 用户身份退出,并且运行时编译正常制作作为根用户
使用 sudo make 运行时出现错误输出:
make -C /lib/modules/`uname -r`/build M= modules
make[1]: Entering directory '/usr/src/linux-headers-6.2.0-39-generic'
make[2]: *** No rule to make target 'arch/x86/entry/syscalls/syscall_32.tbl', needed by 'arch/x86/include/generated/uapi/asm/unistd_32.h'. Stop.
make[1]: *** [arch/x86/Makefile:248: archheaders] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.2.0-39-generic'
make: *** [Makefile:4: all] Error 2
$(PWD) 命令似乎失败,导致错误。如果有人可以帮助理解或任何真正有帮助的见解,我将不胜感激。谢谢
答案1
您的sudo
配置是在运行给定的命令之前清理环境;在运行PWD
前被清除make
。
要更改此设置,您可以询问sudo
不是净化环境:
sudo -E make
(如果配置允许)或手动提供PWD
值:
sudo make PWD="$PWD"
还应该可以更改 Makefiles 以使用 Make 自己的“当前目录”变量CURDIR
:
all:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) modules