编译dump_stack.ko时Makefile报错‘commands commence before first target’如何解决
内核模块编译报错修复方案
问题现象
编译调用dump_stack()的内核模块时失败,执行make命令触发如下错误:
kesl@kesl-1080Ti:~/Downloads/trace$ make Makefile:6: *** commands commence before first target. Stop.
已排查一整天,当前环境为Ubuntu 20.04、Kernel 5.18.0-rc6、make 3.81,切换make版本(从4.2.1降至3.81)问题依旧,用同格式Makefile编译hello.c也报相同错误。
相关代码
dump_stack.c
#include <linux/module.h> #include <linux/kernel.h> static int myinit(void) { pr_info("dump_stack myinit\n"); dump_stack(); pr_info("dump_stack after\n"); return 0; } static void myexit(void) { pr_info("panic myexit\n"); } module_init(myinit) module_exit(myexit) MODULE_LICENSE("GPL");
原问题Makefile
obj-m+= dump_stack.o KERNEL_DIR = /lib/modules/$(shell uname -r)/build PWD = $(shell pwd) all: $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules clean: $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) clean
修复方案
错误根源是Makefile的格式违反了语法规则:
- 变量定义、目标声明的行开头不能有空格
- 目标下的命令行必须用Tab键缩进(不能用空格替代)
修正后的Makefile如下:
obj-m+= dump_stack.o KERNEL_DIR = /lib/modules/$(shell uname -r)/build PWD = $(shell pwd) all: $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules clean: $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) clean
核心修正点:
- 移除
obj-m、KERNEL_DIR、PWD、all:、clean:所有行开头的空格 - 将
all、clean目标下的命令行开头替换为Tab键(注意是单个Tab,不是多个空格)
重新执行make命令即可正常生成dump_stack.ko内核模块。
内容的提问来源于stack exchange,提问作者DongSeok Son
相关产品推荐
相关产品推荐

