Makefile 对应内核版本:2.6.35.13
vmlinux-init 和 vmlinux-main 是 vmlinux 目标的两个依赖。在顶层 Makefile 中有一段注释图:
它们的定义为:
上面 $(head-y) 变量一般定义在与架构相关的 Makefile 中,比如在 x86 上,它定义在 arch/x86/Makefile 里:
head-y 所代表的对象文件一般放在编译出来的内核镜像文件的前面部分。
除去 $(head-y) 外,其它的 $(init-y),$(core-y), $(libs-y), $(drivers-y) 和 $(net-y) 这些变量都定义在顶层 Makefiel 中,它们一开始都被定义成相关的目录:
这里需要注意,上面这些定义在顶层 Makefile 中变量所表示的内容是与架构无关的,也就是任何架构都需要它们。但是在架构相关的 Makefile 中往往还会追加与架构相关的代码,比如在 arch/x86/Makefile 里就有:
上面的变量只是初始设置,在编译 vmlinux 中,后面还会对这些指代不同目录的变量进行重新设置,在顶层 Makefile 中会看到:
以 init-y 来说,它由原先指代目录,现在变成了指代该目录下的 built-in.o 文件了---几乎任何一个目录下都能看到 built-in.o 这个文件。在 x86 下,在 arch/x86/lib/ 和 lib/ 这两个目录下,还会看到 lib.a 这个库文件。在构建内核时,内核构建系统会一一产生这些 built-in.o,lib.a 以及其它一些对象文件,最后会将它们全部链接起来,从而形成 vmlinux 镜像文件。
vmlinux-init 和 vmlinux-main 是 vmlinux 目标的两个依赖。在顶层 Makefile 中有一段注释图:
引用# vmlinux
# ^
# |
# +-< $(vmlinux-init)
# | +--< init/version.o + more
# |
# +--< $(vmlinux-main)
# | +--< driver/built-in.o mm/built-in.o + more
它们的定义为:
1
2
|
vmlinux-init :=
$(head-y)
$(init-y)
vmlinux-main :=
$(core-y)
$(libs-y)
$(drivers-y)
$(net-y)
|
上面 $(head-y) 变量一般定义在与架构相关的 Makefile 中,比如在 x86 上,它定义在 arch/x86/Makefile 里:
1
2
3
4
5
6
7
|
###
# Kernel objects
head-y := arch
/x86/kernel/head_
$(BITS)
.o
head-y += arch
/x86/kernel/head
$(BITS)
.o
head-y += arch
/x86/kernel/head
.o
head-y += arch
/x86/kernel/init_task
.o
|
head-y 所代表的对象文件一般放在编译出来的内核镜像文件的前面部分。
除去 $(head-y) 外,其它的 $(init-y),$(core-y), $(libs-y), $(drivers-y) 和 $(net-y) 这些变量都定义在顶层 Makefiel 中,它们一开始都被定义成相关的目录:
1
2
3
4
5
6
7
8
|
# Objects we will link into vmlinux / subdirs we need to visit
init-y := init/
drivers-y := drivers/ sound/ firmware/
net-y := net/
libs-y := lib/
core-y := usr/
... ...
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
|
这里需要注意,上面这些定义在顶层 Makefile 中变量所表示的内容是与架构无关的,也就是任何架构都需要它们。但是在架构相关的 Makefile 中往往还会追加与架构相关的代码,比如在 arch/x86/Makefile 里就有:
1
2
3
4
|
libs-y += arch
/x86/lib/
... ...
# See arch/x86/Kbuild for content of core part of the kernel
core-y += arch
/x86/
|
上面的变量只是初始设置,在编译 vmlinux 中,后面还会对这些指代不同目录的变量进行重新设置,在顶层 Makefile 中会看到:
1
2
3
4
5
6
7
|
init-y := $(
patsubst
%/, %
/built-in
.o,
$(init-y)
)
core-y := $(
patsubst
%/, %
/built-in
.o,
$(core-y)
)
drivers-y := $(
patsubst
%/, %
/built-in
.o,
$(drivers-y)
)
net-y := $(
patsubst
%/, %
/built-in
.o,
$(net-y)
)
libs-y1 := $(
patsubst
%/, %
/lib
.a,
$(libs-y)
)
libs-y2 := $(
patsubst
%/, %
/built-in
.o,
$(libs-y)
)
libs-y :=
$(libs-y1)
$(libs-y2)
|
以 init-y 来说,它由原先指代目录,现在变成了指代该目录下的 built-in.o 文件了---几乎任何一个目录下都能看到 built-in.o 这个文件。在 x86 下,在 arch/x86/lib/ 和 lib/ 这两个目录下,还会看到 lib.a 这个库文件。在构建内核时,内核构建系统会一一产生这些 built-in.o,lib.a 以及其它一些对象文件,最后会将它们全部链接起来,从而形成 vmlinux 镜像文件。