Arm Linux交叉编译和连接过程分析(2)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Arm Linux交叉编译和连接过程分析(2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                二、編譯內核鏡像過程
1、編譯過程中涉及到到文件:
/Makefile 編譯產生頂層vmlinux鏡像文件 /scripts/Kbuild.include ? make過程中到一些基本定義 /scripts/Makefile.lib?????? 編譯內核時用到到函數庫文件 /scripts/Makefile.build???? 內核編譯到相關命令文件 /arch/arm/Makefile??????? 這個是體系結構相關makefile文件 /arch/arm/Kconfig??????? 內核編譯到配置文件 /arch/arm/boot/Makefile 生成uImage,zImage,Image到編譯文件 /arch/arm/boot/compressed/Makefile 生成最終vmlinux到編譯文件 /arch/arm/mach-sep4020/Makefile SEP4020系統結構的編譯文件 ?2、編譯過程解析;
2.1 /include/linux/autoconfig.h的產生:
在頂層Makefile的487行有相應的編譯命令,這個就是把我們頂層的.config文件轉變成相應的系統的autoconfig.h文件,而在/include/linux/config.h中有這么一句: #include <linux/autoconf.h> 以后在c文件中會包含這個/include/linux/config.h頭文件的,也即包含了linux/autoconf.h文件2.2、vmlinux的依賴關系
2.2.1在/Makefile中的298行 # We need some generic definitions include? $(srctree)/scripts/Kbuild.include 包含了scripts/Kbuild.include文件,在這里定義了大量的函數和變量,供頂層makefile和其他makefile文件使用。??
2.2.2在頂層makefile文件的第175行,包含了arch/arm/Makefile。這個是體系結構相關makefile文件。它定義了體系結構相關的一些變量及規則。 下面這個地方將/arch/arm/Makefile文件引入
2.2.3當執行”make”時,arch/arm/Makefile中的499行的規則將是make遇到的第一個規則:
all:?? vmlinux
export KBUILD_IMAGE ?= vmlinux(變量賦值) 2.2.4vmlinux目標的規則在頂層Makefile的第741行定義。
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE ???????? $(call if_changed_rule,vmlinux__) ???????? $(Q)rm -f .old_version
2.2.5這里涉及到幾個變量,先看看這幾個變量的定義,前三個變量分別在頂層Makefile的605、606、608行定義。? 2.2.6其中head-y在arch/arm/Makefile中第72行定義,
head-y??????????????? := arch/arm/kernel/head.o arch/arm/kernel/init_task.o
2.2.7 init-y在頂層makefile的462行定義?
? 后又在第567行進行處理
init-y????????????? := $(patsubst %/, %/built-in.o, $(init-y))
? 這里的$(patsubst %/, %/built-in.o, $(init-y)) 這個語句就是將init/ 下的所有c文件編譯成目標文件build-in.o
所以變量init-y應為
init-y????????????? := init/built-in.o
因此
vmlinux-init := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o init/built-in.o
同理,其他幾個變量也可通過類似方法進行分析,這里不一一分析了。 2.5vmlinux-init這個變量的產生構建規則在頂層Makefile 747行定義:
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
這里是一個空命令的規則。空命令行可以防止make在執行時試圖為重建這個目標去查找隱含命令。其依賴為vmlinux-dirs,這個變量在頂層Makefile第561行定義: 這個變量指定了一系列要進入的下層目錄。他的規則在頂層Makefile第757行定義
$(vmlinux-dirs): prepare scripts
?????? $(Q)$(MAKE) $(build)=$@
這里的兩個依賴就不分析了,主要看一下這個規則的命令,build和$@變量展開后如下
?????? $(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build ?\
??????? obj =$(vmlinux-dirs)
這里會再一次進入scripts/Makefile.build執行82行規則
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
?????? ?$(if $(KBUILD_MODULES),$(obj-m)) \
?????? ?$(subdir-ym) $(always)
?????? @:
?$(if $(KBUILD_BUILTIN),$(builtin-target))表示若KBUILD_BUILTIN定義了,則整個表達式為$(builtin-target)
因為KBUILD_BUILTIN在頂層Makefile 195行中被初始化為1,所以這個規則的依賴有一個builtin-target變量。這個變量在scripts/Makefile.build的77行定義
ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),) builtin-target := $(obj)/built-in.o
endif (strip用法:strip <選項> 輸入文件?? 作用:從文件中刪除符號和節)
變量obj就是vmlinux-dirs變量指定的目錄,這在前面說到的。所以這里會構建$(vmlinux-dirs)/built-in.o目標,在scripts/Makefile.build文件的251行開始,有這個目標的規則及命令的定義?
? scripts/Makefile.build在第15行開始包含了vmlinux-dirs變量指定目錄中的Makefile文件,在這些makefile文件中會指定obj-y變量,它指定的都是一些*.o目標文件, 這些*.o文件的生成方法由scripts/Makefile.build文件192行的模式規則指定
%.o: %.c FORCE
?????? $(call cmd,force_checksrc)
?????? $(call if_changed_rule,cc_o_c) 這個就是我們看到的編譯各個目錄下.o目標文件的過程,這個中間在182行中: $(if $($(quiet)cmd_cc_o_c),echo '? $(call escsq,$($(quiet)cmd_cc_o_c))';)? \(其中的分號表示不顯示命令執行) 這個就會在屏幕上輸出編譯的信息: CC????? net/ipv4/devinet.o
通過上面這一系列的步驟,就編譯鏈接出由變量vmlinux-init指定的目標,vmlinux-main變量指定的目標的構建與此類似。
總結
以上是生活随笔為你收集整理的Arm Linux交叉编译和连接过程分析(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: bbb mmc_blk_probe
 - 下一篇: SDL以及扩展库的交叉编译过程简介