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