1. Makefile種類
名稱 | 描述 |
---|---|
頂層Makefile | 它是所有Makefile文件的核心,從總體上控制着內核的編譯、鏈接。 |
.config | 配置文件,配置內核時生成。頂層以及各子目錄Makefile都是根據.config來決定使用哪些文件。 |
arck/%(ARCK)/Makefile | 對應體系結構的Makefile,它用來決定哪些體系結構相關的文件參與內核的生成,並提供一些規則來生產特定格式的內核映像。 |
scripts/Makefile.* | Makefile公用的通用通用規則、腳本。 |
kbuild Makefiles | 各級子目錄的Makefile,它們相對簡單,被上一層Makefile調用來編譯當前目錄下的文件。 |
Makefile文檔:<kernel path>/Documentation/kbuild/makefiles.txt
2. 子目錄Makefile
example:
obj-$(CONFIG_XXX) +=yyy.o
用來表示該選項編譯進內核還是編譯爲模塊。
如果多個文件編譯爲一個模塊:
example:
obj-$(CONFIG_ISDN)+= isdn.o
isdn-objs:=isdn_net_lib.o isdn_v110.o isdn_common.o
若CONFIG_ISDN=m
則最終生成isdn.ko
文件。
3. 架構相關的Makefile
例如ARM平臺:
<kernel path>/arch/arm/Makefile
4. .config文件
我們知道.config
文件在編譯時會生成auto.conf
,在頂層Makefile中:
我們發現-include includ/config/zuto.conf
,即頂層Makefile中包含了auto.conf
文件。
5. 頂層Makefile
我們編譯內核時 使用make uImage
命令。以此爲線索,我們發現:
頂層Makefile:
include $(srctree)/arch/$(ARCH)/Makefile
其中:
ARCH ?=arm
即include <kernel dir>/arch/arm/Makefile
即頂層目錄包含了架構的Makefile。
我們打開架構Makefile:
uImage : vmlinux
因此我們才能在頂層目錄執行make uImage
生成uImage
。
而uImage
依賴於vmlinux
。
我們發現vmlinux
的依賴:
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
即vmlinux
依賴於:
vmlinux-lds
vmlinux-init
vmlinux-main
kallsyms.o
這些參數完全展開後就是vmlinux的依賴項。其中包括了第一個文件:arch/arm/kernel/head.S
以及鏈接腳本:arch/arm/kernel/vmlinux.lds
vmlinux
的編譯規則,如果將其展開同樣會很龐大,我們直接make uImage V=1
查看構建過程,
在最後鏈接vmlinux
時可以看到vmlinux
是如何構成的:
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
小結:
這裏最重要的是剖析了Makefile,目的是瞭解內核的編譯過程。最重要的兩個文件:第一個文件:arch/arm/kernel/head.S
以及鏈接腳本:arch/arm/kernel/vmlinux.lds