一. Linux内核源码的make编译
上一篇文章分析了 Linux内核源码的 make后生成的 vmlinux 所依赖的几个目标。依赖目标包括:
scripts/link-vmlinux.sh
$(head-y) 、 $(init-y) 、 $(core-y) 、 $(libs-y) 、 $(drivers-y) 和 $(net-y)
本文重点来看一下 $(head-y) 、 $(init-y) 、 $(core-y) 、 $(libs-y) 、 $(drivers-y) 和 $(net-y) 这六个变量的值。
本文续上一篇文章,地址如下:
Linux内核顶层Makefile的make过程说明一_凌肖战的博客-CSDN博客
二. Linux内核源码的make过程
下面重点分析一下 $(head-y) 、$(init-y)、$(core-y) 、$(libs-y) 、$(drivers-y) 和 $(net-y) 这六个变量的值。
扫描二维码关注公众号,回复:
16839951 查看本文章
1. head-y
head-y 定义在文件 arch/arm/Makefile 中,内容如下:
135 head-y := arch/arm/kernel/head$(MMUEXT).o
当不使能
MMU
的话,
MMUEXT=-nommu
,如果使能
MMU
的话为空,因为我们一般都是用到MMU。因此 ,
head-y 最终的 值为:
head-y = arch/arm/kernel/head.o
2. init-y、drivers-y 和 net-y
在顶层 Makefile 中有如下代码:
558 init-y := init/
559 drivers-y := drivers/ sound/ firmware/
560 net-y := net/
......
896 init-y := $(patsubst %/, %/built-in.o, $(init-y))
898 drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
899 net-y := $(patsubst %/, %/built-in.o, $(net-y))
以上可知:init-y、libs-y、drivers-y 和 net-y 最终的值为:
init-y = init/built-in.o
drivers-y = drivers/built-in.o sound/built-in.o firmware/built-in.o
net-y = net/built-in.o
3. libs-y
libs-y 基本和 init-y 一样,在顶层 Makefile 中存在如下代码:
561 libs-y := lib/
......
900 libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
901 libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
902 libs-y := $(libs-y1) $(libs-y2)
上面的顶层 Makefile 代码可以看出,
libs-y
应该等于 “
lib.a built-in.o
” ,这个只是一部分!
因为
在
arch/arm/Makefile
中会向
libs-y
中追加一些值,代码如下:
286 libs-y := arch/arm/lib/ $(libs-y)
arch/arm/Makefile
将
libs-y
的值改为了:
arch/arm/lib $(libs-y)
,展开以后为:
libs-y = arch/arm/lib lib/
结合 顶层Makefile 与 arch/arm/Makefile 两个文件的设置,libs-y 最终应该为:
libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o
4. core-y
core-y
和
init-y
也一样,在顶层
Makefile
中有如下代码:
532 core-y := usr/
......
887 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
但是,在
arch/arm/Makefile
中会对
core-y
进行追加,代码如下:
269 core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
270 core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)
271 core-$(CONFIG_VFP) += arch/arm/vfp/
272 core-$(CONFIG_XEN) += arch/arm/xen/
273 core-$(CONFIG_KVM_ARM_HOST) += arch/arm/kvm/
274 core-$(CONFIG_VDSO) += arch/arm/vdso/
275
276 # If we have a machine-specific directory, then include it in the
build.
277 core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
278 core-y += arch/arm/probes/
279 core-y += arch/arm/net/
280 core-y += arch/arm/crypto/
281 core-y += arch/arm/firmware/
282 core-y += $(machdirs) $(platdirs)
第
269~274
行根据不同的配置向
core-y
追加不同的值,比如使能
VFP
的话,就会在
.config
中有
CONFIG_VFP=y
这一行,那么
core-y
就会追加 “
arch/arm/vfp/
” 。
第
277~282
行就是对
core-y 进行
直接追加的值。
在顶层 Makefile 中有如下一行:
897 core-y := $(patsubst %/, %/built-in.o, $(core-y))
经过上述代码的转换,最终 core-y 的值为:
core-y = usr/built-in.o arch/arm/vfp/built-in.o \
arch/arm/vdso/built-in.o arch/arm/kernel/built-in.o \
arch/arm/mm/built-in.o arch/arm/common/built-in.o \
arch/arm/probes/built-in.o arch/arm/net/built-in.o \
arch/arm/crypto/built-in.o arch/arm/firmware/built-in.o \
arch/arm/mach-imx/built-in.o kernel/built-in.o\
mm/built-in.o fs/built-in.o \
ipc/built-in.o security/built-in.o \
crypto/built-in.o block/built-in.o
关于 head-y 、init-y、core-y 、libs-y 、drivers-y 和 net-y 这 6 个变量就讲解到这里。