linux交叉编译过程,Arm Linux交叉编译和连接过程分析(2) - Linux - Linux My world

2.2.3当执行”make”时,arch/arm/Makefile中的499行的规则将是make遇到的第一个规则:

all:   vmlinux

export KBUILD_IMAGE ?= vmlinux(变量赋值)

2.2.4vmlinux目标的规则在顶层Makefile的第741行定义。

vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE

$(call if_changed_rule,vmlinux__)

$(Q)rm -f .old_version

7384283_4.jpg

2.2.5这里涉及到几个变量,先看看这几个变量的定义,前三个变量分别在顶层Makefile的605、606、608行定义。

7384283_5.jpg

2.2.6其中head-y在arch/arm/Makefile中第72行定义,

head-y                := arch/arm/kernel/head.o arch/arm/kernel/init_task.o

2.2.7 init-y在顶层makefile的462行定义

7384283_6.jpg

后又在第567行进行处理

init-y              := $(patsubst %/, %/built-in.o, $(init-y))

这里的$(patsubst %/, %/built-in.o, $(init-y)) 这个语句就是将init/ 下的所有c文件编译成目标文件build-in.o

所以变量init-y应为

init-y              := init/built-in.o

因此

vmlinux-init := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o init/built-in.o

同理,其他几个变量也可通过类似方法进行分析,这里不一一分析了。

2.5vmlinux-init这个变量的产生构建规则在顶层Makefile 747行定义:

$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;

这里是一个空命令的规则。空命令行可以防止make在执行时试图为重建这个目标去查找隐含命令。其依赖为vmlinux-dirs,这个变量在顶层Makefile第561行定义:

7384283_7.jpg

这个变量指定了一系列要进入的下层目录。他的规则在顶层Makefile第757行定义

$(vmlinux-dirs): prepare scripts

$(Q)$(MAKE) $(build)=$@

这里的两个依赖就不分析了,主要看一下这个规则的命令,build和$@变量展开后如下

$(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build  \

obj =$(vmlinux-dirs)

这里会再一次进入scripts/Makefile.build执行82行规则

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \

$(if $(KBUILD_MODULES),$(obj-m)) \

$(subdir-ym) $(always)

@:

$(if $(KBUILD_BUILTIN),$(builtin-target))表示若KBUILD_BUILTIN定义了,则整个表达式为$(builtin-target)

因为KBUILD_BUILTIN在顶层Makefile 195行中被初始化为1,所以这个规则的依赖有一个builtin-target变量。这个变量在scripts/Makefile.build的77行定义

ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),)

builtin-target := $(obj)/built-in.o

endif

(strip用法:strip 输入文件   作用:从文件中删除符号和节)

变量obj就是vmlinux-dirs变量指定的目录,这在前面说到的。所以这里会构建$(vmlinux-dirs)/built-in.o目标,在scripts/Makefile.build文件的251行开始,有这个目标的规则及命令的定义

7384283_8.jpg

scripts/Makefile.build在第15行开始包含了vmlinux-dirs变量指定目录中的Makefile文件,在这些makefile文件中会指定obj-y变量,它指定的都是一些*.o目标文件,

7384283_9.jpg

这些*.o文件的生成方法由scripts/Makefile.build文件192行的模式规则指定

%.o: %.c FORCE

$(call cmd,force_checksrc)

$(call if_changed_rule,cc_o_c)

7384283_10.jpg

这个就是我们看到的编译各个目录下.o目标文件的过程,这个中间在182行中:

$(if $($(quiet)cmd_cc_o_c),echo '  $(call escsq,$($(quiet)cmd_cc_o_c))';)  \(其中的分号表示不显示命令执行)

这个就会在屏幕上输出编译的信息:

CC      net/ipv4/devinet.o

通过上面这一系列的步骤,就编译链接出由变量vmlinux-init指定的目标,vmlinux-main变量指定的目标的构建与此类似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值