配置編譯過程詳解2

2021-09-01 13:01:33 字數 4184 閱讀 2070

檔案的路徑:uboot/mkconfig

檔案被引用的地方:被uboot/makefile呼叫兩次:

第一次被呼叫是在配置階段:

x210_sd_config :	unconfig

@$(mkconfig) $(@:_config=) arm s5pc11x x210 samsung s5pc110

@echo "text_base = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

這裡是將x210_sd_config 後面的_config替換為空,然後x210_sd作為執行mkconfig的引數和後面的arm s5pc11x x210 samsung s5pc110一起傳給mkconfig。傳入之後$1=x210_sd  $2=arm $3=s5pc11x  $4=x210   $5=samsung   $6=s5pc110  $#=6

第二次是在編譯時make執行過程,makefile內的**被以此執行,然後被應用呼叫:(101行)

mkconfig	:= $(srctree)/mkconfig

export mkconfig

mkcongfig具體的功能:

1.確定了開發板的一些名稱資訊;

3.根據具體板子的資訊,在根目錄下建立config.mk檔案;

board_name="" # name to print in make output

選擇mkconfig的預設值為建立新的配置檔案;設定board_name 板子名預設值為空。

2.規定了傳入引數的個數限制:

while [ $# -gt 0 ] ; do

case "$1" in

--) shift ; break ;;

-n) shift ; board_name="$" ; shift ;;

*) break ;;

esac

done

[ "$" ] || board_name="$1"

注:查詢board_name是否有值,沒有的話賦值為$1(smdkv210single_config)

[ $# -lt 4 ] && exit 1

[ $# -gt 6 ] && exit 1

規定了傳入引數的個數要求,$#必須大於4小於6  即傳入的引數必須4~6

3.make配置階段的乙個除錯資訊的列印:

echo "configuring for $ board..."
在我們make配置完之後會列印出,這裡的board_name會替換為 $1=x210_sd 

4.建立符號鏈結(這個是mkconfig中比重很大的一部分)

從這裡開始的**便是建立符號鏈結及一些標頭檔案,其根本目的是使uboot具有可移植性。uboot中有很多功能平行的**檔案,各自屬於各自不同的平台/開發板/cpu。通過傳入此shell指令碼的引數,來建立指向我們需要的檔案的符號鏈結。但uboot並不直接與這些功能平行的**建立聯絡,符號鏈結幫助uboot遮蔽了許多用不到的**。比如某原始檔中包含了乙個#include「asm/xx.h」,其中asm為本指令碼檔案建立的符號鏈結,它指向的位址為根目錄下include/asm-arm,由此便可以定位到真正的路徑,即」根目錄下include/asm-arm/xx.h」。綜上所述,建立符號鏈結的本質是通過不同的引數,令源**檔案包含特定的檔案

符號鏈結檔案是我們整個配置過程的核心,這些符號鏈結檔案(資料夾)的主要作用是給標頭檔案包含等過程提供指向性鏈結,使得uboot有可移植性。

uboot的移植原理:在uboot之中有很多彼此平行的**,各自屬於各自不同的架構/cpu/開發板,我們在具體到某個開發板的編譯時用符號連線的方式提供乙個具體名字的資料夾供編譯器使用。就可以在配置過程中通過配置使用不同的檔案,從而正確的包含正確的檔案。

(1)在include目錄下建立asm檔案,指向asm-arm   43~48行

mkdir asm-$2

ln -s asm-$2 asm

是將asm-$2 這個檔案指向asm檔案,在訪問asm檔案時就相當於訪問了asm-$2;

2)在include/asm-arm下建立乙個arch檔案,指向include/asm-arm/arch-s5pc110  56行;

if [ -z "$6" -o "$6" = "null" ] ; then

ln -s $arch-$3 asm-$2/arch

else

ln -s $arch-$6 asm-$2/arch

fi

(3)在include目錄下建立乙個reg.h檔案,指向include/s5pc110.h檔案 86行

if [ "$3" = "s5pc11x" ] ; then

rm -f regs.h

ln -s $6.h regs.h

(4)將include/asm-arm下的arch檔案指向include/asm-arm/arch-s5pc11x (覆蓋了2中的符號鏈結) 88行  

rm -f asm-$2/arch

ln -s arch-$3 asm-$2/arch

fi

(5)在include目錄下建立了proc檔案,指向 include/asm-$2/procproc-armv   109

if [ "$2" = "arm" ] ; then

rm -f asm-$2/proc

ln -s $proc-armv asm-$2/proc

fi

注1:objtree和srctree在當前目錄下本地編譯時它所代表的目錄是相同的,在-o指定目錄編譯時不相等,此時objtree仍然代表根目錄,srctree則是指定目錄的根目錄。

ln -s arch-$3 asm-$2/arch(當前目錄:/include)
則在/include/asm-$2下建立了arch檔案,檔案指向/include/asm-$2目錄下的arch-$6檔案;

5.指導生成我們的uboot/include/config.mk檔案:

#

# create include file for make

#echo "arch = $2" > config.mk

echo "cpu = $3" >> config.mk

echo "board = $4" >> config.mk

[ "$5" ] && [ "$5" != "null" ] && echo "vendor = $5" >> config.mk

[ "$6" ] && [ "$6" != "null" ] && echo "soc = $6" >> config.mk

注:>:檢查目錄,如果檔案不存在則建立,然後在檔案內追加》之前的內容。

>>:在檔案內的尾行追加》之前的內容

在檢視shell指令碼程式是時刻注意自己當前的目錄。

#

# create board specific header file

#then

echo >> config.h

else

> config.h # create new config file

fiecho "/* automatically generated - do not edit */" >>config.h

echo "#include " >>config.h

exit 0

簡單的判斷之後在include目錄下下建立乙個config.h檔案。而在後面利用管道向其內寫了一段話,並且包含了我們板子對應的標頭檔案。而那個標頭檔案是我們移植是最重要的檔案,它涉及我們對開發板的巨集定義配置檔案。

這些/uboot/include/configs/*****.h>檔案會被用來autoconf.mk檔案,autoconf.mk檔案會被主makefile引用,指導整個編譯過程,這裡面的巨集定義會影響我們對uboot中大部分.c檔案的條件編譯的選擇,從而實現可移植性。

uboot配置過程詳解2

1 建立iinclude config.mk檔案 mkconfig檔案123 129行 2 建立include config.mk檔案是為了讓makefile在133行去包含的 詳解見 3 思考 uboot的配置和編譯過程的配合。編譯的時候需要arch arm cpu xx等這些變數來指導編譯,配置...

編譯過程2

編譯過程就是將高階語言寫的源 程式編譯成機器可識別的可執行程式。主要要經歷編譯 彙編 鏈結三個過程。在linux系統中,編譯階段,gcc編譯器編譯器會將c語言寫好的源 檔案,通過詞法分析 語法分析 語義分析編譯成彙編 彙編 要根據不同的平台確定,mips x86 arm不同的體系架構的彙編 各不相同...

C C 編譯過程詳解

gcc編譯過程四個步驟 1 預編譯 處理標頭檔案,處理巨集定義 2 編譯 c 編譯成 s檔案 3 彙編 s頭檔案匯編成機器碼.o 4 連線 吧不同的.o檔案連線起來。生成乙個可執行檔案 分析器 將源語言程式 轉換為組合語言,因為要從一種格式轉換為另一種格式分析器需要知道目標機器的組合語言。c 彙編 ...