基于lkmpg开发Linux内核模块,如何获取预处理器输出?
获取Linux内核模块预处理器输出的便捷方法
基于内核Kbuild系统(也就是你用的lkmpg示例Makefile依赖的构建框架),有几种便捷方式获取预处理器输出:
1. 直接通过内核Makefile生成单个文件的预处理结果
针对你的模块源文件(比如mymod.c),在模块代码目录下运行:
make -C /lib/modules/$(uname -r)/build M=$(pwd) cppsrc=mymod.c
执行完成后,同目录下会生成mymod.i文件,这就是经过宏展开、头文件全部包含后的预处理器输出。
2. 给Makefile添加自定义目标简化命令
如果不想每次都输入长命令,可以在lkmpg的示例Makefile中添加一个自定义目标:
# 新增预处理目标,格式为 cpp-<源文件名> cpp-%: %.c $(MAKE) -C $(KERNELDIR) M=$(PWD) cppsrc=$<
之后只需要运行make cpp-mymod就能生成对应的mymod.i文件,更省心。
3. 手动调用预处理器(不推荐)
如果一定要手动操作,需要先获取内核构建所需的头文件路径,再调用cpp:
# 先确保内核构建脚本就绪 make -C /lib/modules/$(uname -r)/build scripts # 调用cpp生成预处理文件 cpp -I/lib/modules/$(uname -r)/build/include \ -I/lib/modules/$(uname -r)/build/arch/$(uname -m)/include/generated \ -include linux/kconfig.h -include linux/compiler_types.h \ mymod.c -o mymod.i
这种方法需要手动指定所有必要的头文件路径和强制包含的内核头,容易遗漏,远不如前两种方法可靠。
生成的.i文件可以直接用文本编辑器打开,或者用grep、less等工具查看,适合调试宏定义展开、条件编译逻辑等问题。
内容的提问来源于stack exchange,提问作者Petr Skocik
相关产品推荐
相关产品推荐

