linux核心的makefile檔案分類:
1.頂層的makefile
2..config 所有的makefile都是由.config來決定使用那些檔案。
3.arch下的makefile
4.script下的makefile
5.kbuild makefile 各級子目錄下的makefile。
在linux-2.6.22.6\documentation\kbuild目錄下的makefiles.txt對核心的makefile講的比較清楚,可以細看。
在子目錄下,如果有a.c b.c 兩個模組要編譯成模組可以這麼做
obj-m += ab.o
ab-objs := a.o b.o
我們要分析makefile從頂層的makefile往下分析:
我們在編譯核心的時候make uimage命令,那麼uimage 的目標是位於**呢,我們的架構是arch/arm架構的,在這個目錄下的makefile可以找到他。
那我們在make uimage的時候,頂層目錄下並沒有找到uimage,那它是怎麼做到make uimage的呢?
根據我們對makefile的了解,那arch/arm架構的的makefile可以被包含到頂層目錄下的makefile下,在頂層的makefile下查詢include我們可以找到:
# read arch specific makefile to set kbuild_defconfig as needed.
# kbuild_defconfig may point out an alternative default configuration
# used for 'make defconfig'
include $(srctree)/arch/$(arch)/makefile
可以看出它是被包含到頂層的makefile了。
對於.config 會生成autoconf.h、auto.conf,他是不是也被包含進頂層的makefile了呢,查一下auto.conf。
# read in config
-include include/config/auto.conf
可以看到也是包含進來了。
zimage image xipimage bootpimage uimage: vmlinux
uimage的依賴是vmlinux,我們在架構下的makefile下並沒有找到vmlinux的依賴,在頂層的makefile下找到了vmlinux的依賴:
# vmlinux image - including updated kernel symbols
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) force
那vmlinux-lds、vmlinux-main、vmlinux-init這些分別是什麼呢,我們可以在頂層的makefile下查查:
vmlinux-init := $(head-y) $(init-y)
#default value
head-y:= arch/arm/kernel/head$(mmuext).o arch/arm/kernel/init_task.o //在架構下的makefile定義的。
init-y:= init/
init-y:= $(patsubst %/, %/built-in.o, $(init-y)) //在頂層的makefile下定義的。
$(patsubst %.c,%.o,x.c.c bar.c)
把字串「x.c.c bar.c」中以.c結尾的單詞替換成以.o結尾的字元。函式的返回結果是「x.c.o bar.o」
展開為:init-y:= init/build-in.o
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
core-y:= usr/
core-y+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y:= $(patsubst %/, %/built-in.o, $(core-y))
展開為:core-y :=usr/build-in.o kernel/build-in.o mm/build-in.o fs/build-in.o security/build-in.o crypto/build-in.o block/build-in.o
libs-y:= lib/
libs-y1:= $(patsubst %/, %/lib.a, $(libs-y))
libs-y2:= $(patsubst %/, %/built-in.o, $(libs-y))
libs-y:= $(libs-y1) $(libs-y2)
展開為libs-y:= lib/build-in.o lib/lib.a
drivers-y:= drivers/ sound/
drivers-y:= $(patsubst %/, %/built-in.o, $(drivers-y))
展開為drivers-y:= drivers/build-in.o sound/build-in.o
net-y:= net/
net-y:= $(patsubst %/, %/built-in.o, $(net-y))
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(arch)/kernel/vmlinux.lds
前面分析的一堆原材料是怎麼被鏈結到一起的呢?
# vmlinux image - including updated kernel symbols
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) force
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
要是我們之前編譯過核心的話我們先rm vmlinux,然後make uimage v=1 //v=1的作用是把命令更詳細的列出
arm-linux-ld -el -p --no-undefined -x -o vmlinux -t arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c2410/built-in.o arch/arm/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-s3c2443/built-in.o arch/arm/nwfpe/built-in.o arch/arm/plat-s3c24xx/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 arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o
擷取一段,我們可以看到這些跟我們之前分析的很對應,待會我們在看下他的鏈結指令碼。
從上面的分析中我們可以得到一些比較中要的資訊:
1.第乙個檔案:arch/arm/kenel/head.s
不過在核心目錄下找不到vmlinux.lds,該檔案為vmlinux.lds.s生成。我們可以打來vmlinux.lds看看他的一些內容。
具體的不做分析了,核心大概的makefile就這樣有個基本的認識了。
sections
.init : { /* init code and data*/
*(.init.text)
_einittext = .;
__proc_info_begin = .;
*(.proc.info.init)
__proc_info_end = .;
__arch_info_begin = .;
*(.arch.info.init)
__arch_info_end = .;
__tagtable_begin = .;
*(.taglist.init)
__tagtable_end = .;
. = align(16);
__setup_start = .;
核心啟動分析之核心啟動
在uboot啟動核心的時候是呼叫什麼函式呢?thekernel 0,bd bi arch number,bd bi boot params 這個函式的引數第二個代表支援的單板型別 機器id 第三個是uboot傳給核心的一些引數。核心啟動分析過程 想要具體分析的話可以像分析uboot的head.s那樣...
u boot啟動之Makefile結構分析
先進行配置命令 make smdk2410 config在makefile檔案中 smdk2410 config unconfig mkconfig config arm arm920t smdk2410 null s3c24x0因此mkconfig檔案中會傳入如下引數 parameters tar...
linux核心makefile分析
核心makefile.txt中將makefile分為 5部分,kernel makefile arch makefile kbuild makefile config檔案以及scripts makefile.kernel makefile kernel makefile 位於linux 核心源 的頂...