2024年3月24日发(作者:)
从makefile开始分析内核编译过程:
我们在编译内核的时候,会使用make命令,那么这个make
命令究竟做了什么工作呢?
顶层vmlinux生成过程
1. Make命令首先会从顶层的makefile中开始执行,按照默认规则,
在makefile中的第一条规则就是其默认规则,
我们首先看到,vmlinux依赖于后面的几项,那么后面的变量又是定义成什么了呢?
以x86为例,到arch/x86/kernel/下去找.确实是存在的。现在就
要去看 $(vmlinux-init)和$(vmlinux-main)
这里又看到,$(vmlinux-init)和$(vmlinux-main)里面的内容是什么?在顶层
makefile中我们可以看到下面的语句:
经过变量代换,我们可以看到是arch/x86/makefile,我们首先分析head-y
其中BITS指的是机器的位数,通常我们分析的是32位机器。我们代换变量后可以看到head-y
由三个主要的文件组成,head_32.o(head_32.S)、head32.o(head32.c)、init_task.o,这是体
系结构相关的。
我们接着分析init-y
从结果可以看出这是一个体系结构无关的。
初始时init-y:=init/经过patsubst函数替换后,会变成init-y:=init/built-in.o。
/******************makefile patsubst函数************************
$(patsubst
名称:模式字符串替换函数——patsubst。
功能:查找
否符合模式< pattern>;,如果匹配的话,则以
可以包括通配符 “%”,表示任意长度的字串。如果
那么,
(可以用“”来转义,以“%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。
示例:
$(patsubst %.c,%. bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”
备注:
这和我们前面“变量章节”说过的相关知识有点相似。如:
“$(var:
而“$(var:
“$(patsubst %
例如有:objects = foo.o bar.o baz.o,那么,“$(objects:.o=.c)”和
“$(patsubst %.o,%.c,$(objects))”是一样的。


发布评论