You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何分步编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:03:13