如果还不熟悉Makefile语法,建议先系统的学习一下,特别是以下几点: (1) Makefile哪些部分包含的是shell语句: 编译规则中的指令部分 ${shell XX},var != XX中的XX部分 $(if …, XX, XX)中的XX部分 (2) 变量展开: =(延迟赋值)、:=(立即赋值)、!=(值为shell命令)、?=(条件赋值)、+=(追加) (3) include:将指定的其它Makefile内容,展开到当前Makefile -f/-C:嵌套执行指定(目录中的)Makefile 执行一个Makefile,并不是从第一行开始执行,而是从指定或默认的编译目标开始执行(位置目标编译规则之前的赋值语句,只在相应变量需要被使用时才会执行),其中,Makefile(包括include内容)中的第一个目标,为默认目标,如果make命令行中没有指定编译目标,则执行默认目标。 (4) 自动推导依赖文件 (5) 根据文件时间戳、中间文件(.d、.cmd),判断依赖更新,决定是否需要重新编译 (6) 重要的内置函数: $(wildcard pattern) $(patsubst pattern, replacement, text) $(strip string) $(filter pattern, text) $(filter-out pattern, text) $(call func, args..) … (7) 自动推导变量: $@:编译目标 $<:依赖列表中的第一个依赖对象 $^:依赖列表中的所有对象 $?:依赖文件列表中所有有更新的文件
Makefile教程可以参考以下这2个: 深入解析Makefile系列:7b6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7K9s2g2S2L8X3I4S2L8W2)9J5k6i4A6Z5K9h3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8U0x3$3x3U0j5@1x3o6x3@1x3H3`.`.(简约,直指核心) 跟我一起写makefile(陈皓):429K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4N6Z5K9i4c8W2k6X3W2K6K9o6f1J5x3q4)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3V1k6V1k6i4c8S2K9h3I4K6i4K6u0r3x3e0l9K6z5e0j5^5y4U0l9&6(精典,超级详细)
Linux内核源码包含一套Makefile程序,本文基于Linux-5.2.5内核源码分析,其中包括top Makefile,scripts/目录下的Makefile、Makefile.build、Makefile.lib、Kbuild.include、Makefile.modpost、kconfig/Makefile等,以及其它目录下的很多子Makefile,统称为Kbuild。Kbuild是按照框架设计思路实现的,使得内核自身包含或外部提供的大量驱动模块,只需要按照Kbuild框架的约定,各自提供一个简单的Makefile即可编译。 所以,理解内核或驱动文件的编译过程,其实就是要理解Kbuild这套Makefile程序的实现逻辑,既然是程序,就免不了会定义一些函数,由于很多关键的流程,都使用了$(build)和$(if_changed),所以以下先单独介绍(本文分析的Makefile内容,来自Linux-5.2.5内核源码):
make命令行指定all/_all/modules目标,或者不指定目标时,是为了生成vmlinux文件,而vmlinux目标间接依赖prepare目标,且prepare目标编译规则展开内容比较多,所以以下分开介绍:
linux Kbuild详解系列:26dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7K9s2g2S2L8X3I4S2L8W2)9J5k6i4A6Z5K9h3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8U0x3$3x3U0j5@1x3o6x3@1x3H3`.`. 跟我一起写makefile:4b1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4N6Z5K9i4c8W2k6X3W2K6K9o6f1J5x3q4)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3V1k6V1k6i4c8S2K9h3I4K6i4K6u0r3x3e0l9K6z5e0j5^5y4U0l9&6
附件:文中部分图片,根据"执行流程.txt"内容截取,其余已经打包到"图.zip"文件。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!