00_內核Kernel的Makefile分析


###### linux-2.6.22.6 分析######

編譯內核命令:
make  或 make uImage 

#搜uImage

(在arch/arm/Makefile中)
zImage Image xipImage bootpImage uImage: vmlinux

#################################################################

(在頂層Makefile中)
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
#-lds 鏈接文件,-init 初始化的代碼,-main 主要的代碼,即和內核很相關的代碼

ifdef CONFIG_HEADERS_CHECK
    $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
    $(call if_changed_rule,vmlinux__)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
    $(Q)rm -f .old_version
#上述代碼描述vmlinux怎麼被編譯的,這些命令最終會生成什麼東西,這些腳本實在是太龐大了,不太容易分析!!!
#有一個簡單的方法,下面的原材料如何編譯成內核的:一個方法是分析makefile(如上);第二個方法是直接編譯內核,如下
rm vmlinux
make uImage V=1     #V=1是把命令更加詳細的列出來
#關心打印出的最後面的命令即可。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
vmlinux-init := $(head-y) $(init-y)

head-y        := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o       #(在arch/arm/Makefile中)
注意:MMUEXT如果沒定義的話,就不用它,最後變成head.o
MMUEXT        := -nommu              # MMUEXT沒有被定義                            #(在arch/arm/Makefile中)

init-y        := init/               #(在頂層Makefile中)
init-y        := $(patsubst %/, %/built-in.o, $(init-y))   #  即相當於  := init/build-in.o
init-y等於init目錄下所有涉及的那些文件,那些文件會被編譯成一個build-in.o

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
#                              核心         庫           驅動          網絡

core-y        := usr/                                                              #(在頂層Makefile中)
core-y        += kernel/ mm/ fs/ ipc/ security/ crypto/ block/                     #(在頂層Makefile中)
core-y        := $(patsubst %/, %/built-in.o, $(core-y))                           #(在頂層Makefile中)
#即core-y最終相當於 usr/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

libs-y        := lib/
#etc
#即libs-y最終相當於 lib/lib.a lib/build-in.o

drivers-y    := drivers/ sound/
#etc
#即drivers-y最終相當於 drivers/build-in.o  sound/build-in.o
#即dirvers下所有涉及的文件都被編譯成build-in.o,sould下所有涉及的文件都被編譯成build-in.o

net-y        := net/
#etc
#即net-y最終相當於 net/build-in.o

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


vmlinux-all  := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds  := arch/$(ARCH)/kernel/vmlinux.lds

等等

#########################################################################

分析makefile可得下面的信息,重要!!!!!!!!!
1. 第一個文件:arch/arm/kernel/head.o
2. 鏈接腳本:arch/arm/kernel/vmlinux.lds

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章