如何分步编译Linux内核模块(预处理-编译-汇编-链接)查看宏展开
Linux内核模块分步编译Makefile修改方案
实现原理
内核Kbuild构建系统原生支持单源文件的预处理、汇编阶段输出,直接复用该规则生成中间文件,可以保证头文件搜索路径、架构专属编译选项、内核配置宏(CONFIG_*)、编译参数和正常编译ko时完全一致,避免手动拼接编译命令导致的宏展开结果失真问题。
修改后完整Makefile
#BIN := app WHILE_TEST := while_test_driver LOG_FILE :=log obj-m := $(WHILE_TEST).o $(WHILE_TEST)-objs := driver.o MAKEOPT := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- export CROSS=arm-none-linux-gnueabi- ARM_LINUX_KERNEL := /home/zhangbh/linux-4.14.139 PWD = $(shell pwd) ccflags-y :=-g all: $(info "while test driver") $(MAKE) $(MAKEOPT) -C $(ARM_LINUX_KERNEL) M=$(PWD) modules # 生成预处理文件driver.i preprocess: $(info "Generating preprocessed output driver.i") $(MAKE) $(MAKEOPT) -C $(ARM_LINUX_KERNEL) M=$(PWD) driver.i # 生成汇编文件driver.S generate-asm: $(info "Generating assembly output driver.S") $(MAKE) $(MAKEOPT) -C $(ARM_LINUX_KERNEL) M=$(PWD) driver.s @mv -f driver.s driver.S objdump: $(CROSS)objdump -S $(WHILE_TEST).o > $(LOG_FILE).txt $(CROSS)objdump -DfhS $(WHILE_TEST).o > $(LOG_FILE)1.txt $(CROSS)objdump --debugging $(WHILE_TEST).o > debugging.txt .PHONY: clean preprocess generate-asm clean: rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order rm -rf $(BIN) rm -rf $(LOG_FILE).txt $(LOG_FILE)1.txt debugging.txt # 清理新增的分步编译中间文件 rm -rf *.i *.s *.S
使用说明
- 执行
make:原有逻辑不变,正常编译生成.ko内核模块文件 - 执行
make preprocess:生成预处理后的driver.i文件,可直接查看module_init、printk、KERN_ALERT、cpu_relax等内核宏的完整展开结果 - 执行
make generate-asm:生成编译阶段输出的driver.S汇编文件 - 执行
make objdump:原有反汇编导出功能不变 - 执行
make clean:清理所有编译产物,包括新增的.i、.S中间文件
提示:
driver.i文件会包含所有引入内核头文件的预处理内容,文件体积较大,可直接搜索自定义函数名(如hello_init)快速定位到自己编写代码的展开位置。
内容的提问来源于stack exchange,提问作者sky
相关产品推荐
相关产品推荐

