Linux 内核模块编译中的 make 和 sudo make 问题

Linux 内核模块编译中的 make 和 sudo make 问题

我目前正在开发一个简单的 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

相关内容