1. 程式人生 > >u-boot分析之Makefile結構分析

u-boot分析之Makefile結構分析

我們分析一個檔案的時候,想知道它是什麼結構?是怎麼連結的,最好的方法就是分析它的makefile檔案。

之前說過u-boot配置、編譯;

為什麼知道先配置後編譯?原始碼中有個readme檔案;

先從makefile檔案中分析一下配置過程;
這裡寫圖片描述

執行make的時候,就相當執行這條命令:
這裡寫圖片描述

我們先在Makefile檔案中搜索一下 MKCONFIG看一下是什麼東西?
這裡寫圖片描述

從上可以看出,在原始檔的目錄下面有一個mkconfig檔案;

我們執行配置命令的時候,就相當執行這條指令碼命令:

這裡寫圖片描述

接著需要開啟mkconfig檔案分析。mkconfig檔案程式碼如下:

#!/bin/sh -e

# Script to create header files and links to configure
# U-Boot for a specific board. # # Parameters: Target Architecture CPU Board [VENDOR] [SOC] # # (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <[email protected]> # APPEND=no # Default: Create new config file BOARD_NAME="" # Name to print in make output #分析傳入的引數裡面有沒有 "--",“-a”等
while [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; *) break ;; esac done #判斷BOARD_NAME有沒有定義,如果沒有則為:$1,其中$1為傳入的第一個引數,依次類推 [ "${BOARD_NAME}" ] || BOARD_NAME="$1" #判斷引數的個數,不合條件就退出 [ $# -lt 4 ] && exit
1 [ $# -gt 6 ] && exit 1 #列印這一句話 echo "Configuring for ${BOARD_NAME} board..." # # Create link to architecture specific headers # #如果這兩個不相等,可以看一下makefile檔案,這兩個是從makefile裡面來的 if [ "$SRCTREE" != "$OBJTREE" ] ; then mkdir -p ${OBJTREE}/include mkdir -p ${OBJTREE}/include2 cd ${OBJTREE}/include2 rm -f asm ln -s ${SRCTREE}/include/asm-$2 asm LNPREFIX="../../include2/asm/" cd ../include rm -rf asm-$2 rm -f asm mkdir asm-$2 ln -s asm-$2 asm else #程式進入這裡分支 cd ./include rm -f asm #建立一個asm的連結檔案,它指向asm-;配置的時候臨時生成指向某一個架構,如果為i386架構,則為asm-i386 ln -s asm-$2 asm fi rm -f asm-$2/arch #如果第六個引數為NULL或者為空 if [ -z "$6" -o "$6" = "NULL" ] ; then ln -s ${LNPREFIX}arch-$3 asm-$2/arch else #我們這裡執行這個分支 #建立一個連結檔案,指向${LNPREFIX}arch-$6,其中$6為傳進來的引數 ln -s ${LNPREFIX}arch-$6 asm-$2/arch fi if [ "$2" = "arm" ] ; then rm -f asm-$2/proc ln -s ${LNPREFIX}proc-armv asm-$2/proc fi # # Create include file for Make # #新建一個config.mk檔案,> 表示新建 echo "ARCH = $2" > config.mk #在config.mk追加, >> 表示追加 echo "CPU = $3" >> config.mk echo "BOARD = $4" >> config.mk #判斷第5個引數,追加 VENDOR = xx [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk #判斷第6個引數,追加 SOC = xx [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk # # Create board specific header file # if [ "$APPEND" = "yes" ] # Append to existing config file then echo >> config.h else > config.h # Create new config file fi #把以下內容追加到config.h檔案中去 echo "/* Automatically generated - do not edit */" >>config.h echo "#include <configs/$1.h>" >>config.h #其中 #include <configs/$1.h> 就是生成的配置檔案 exit 0

配置過程分析完畢;

接著分析一下編譯過程,在makefile檔案裡面,有如下程式碼:

include $(OBJTREE)/include/config.mk

這裡的config.mk就是上面配置生成的配置檔案,這就將配置與編譯結合起來了;

繼續往下檢視makefile檔案

#########################################################################
# U-Boot objects....order is important (i.e. start must be first)

OBJS  = cpu/$(CPU)/start.o

把所有編譯好了的檔案打包一個.a庫

LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

all:        $(ALL)

$(obj)u-boot.hex:	$(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O ihex $< [email protected]

$(obj)u-boot.srec:	$(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O srec $< [email protected]

$(obj)u-boot.bin:	$(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O binary $< [email protected]

$(obj)u-boot.img:	$(obj)u-boot.bin
        ./tools/mkimage -A $(ARCH) -T firmware -C none \
        -a $(TEXT_BASE) -e 0 \
        -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
            sed -e 's/"[     ]*$$/ for $(BOARD) board"/') \
        -d $< [email protected]

$(obj)u-boot.dis:	$(obj)u-boot
        $(OBJDUMP) -d $< > [email protected]

$(obj)u-boot:		depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
        UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
        cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
            --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
            -Map u-boot.map -o u-boot

生成了u-boot.bin檔案,生成的依賴於u-boot,…..

這裡寫圖片描述

相關推薦

u-boot啟動Makefile結構分析

先進行配置命令: make smdk2410_config 在Makefile檔案中: smdk2410_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24

“第09課第2節 u-boot分析Makefile結構分析學習筆記

                        --start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a l

09課02節 u-boot-1.1.6分析Makefile結構分析

我們配置時 是make 100ask24x0_config 這條命令到底幹了什麼?現在分析一下 開啟原始碼目錄樹頂層的makefile 就相當於執行這條命令    @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL

u-boot分析Makefile結構分析

我們分析一個檔案的時候,想知道它是什麼結構?是怎麼連結的,最好的方法就是分析它的makefile檔案。 之前說過u-boot配置、編譯; 為什麼知道先配置後編譯?原始碼中有個readme檔案; 先從makefile檔案中分析一下配置過程; 執行mak

linux-2.6.22.6內核啟動分析Makefile文件

all pts machine bootp ipc 找到 當前目錄 比較 查找 學習目標 分析Makefile文件,了解內核中的哪些文件被編譯,如何被編譯,連接時順序如何確定! Linux內核源碼中包含很多的Makefile文件,這些Makefile文件又包含其它

STL原始碼分析pair結構

前言 前面在分析set, RB-tree都有在insert實現中出現pair, 下節分析map的時候更會經常出現pair, 所以打算在之前先對pair有個認識. pair是一個有兩個變數的結構體, 即誰都可以直接呼叫它的變數, 畢竟struct預設許可權都是public, 將兩個

u-boot sdfuse命令燒錄分析----從SD卡載入核心

在u-boot移植過程中,由於u-boot燒錄在SD卡中,因此老是載入核心失敗,是什麼原因呢?在載入核心的列印資訊中有這樣類似的資訊: reading kernel.. 1120, 10240 MMC read: dev # 1, block # 112

U-boot根目錄下的mkconfig分析

原文地址:http://blog.csdn.net/qq_28992301/article/details/51812103 U-boot根目錄下的mkconfig分析 此檔案位於uboot原始碼的根目錄下,是原始碼自帶的shell指令碼檔案,主要功能是建立符號連結以及一些標

JVM記憶體結構分析

 JVM在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途,以及建立和銷燬的時間,有的區域隨著虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷燬。JVM所管理的記憶體主要包括程式計數器、Java虛擬機器棧、本地方法棧

react-native專案結構分析

前言 庖丁為文惠君解牛,手之所觸,肩之所倚,足之所履,膝之所踦,砉然響然,奏刀騞然,莫不中音。合於桑林之舞,乃中經首之會。 熟悉專案的結構,是開發的基本也是技術提升的一個重要途徑,現總結下自己對react-native專案結構的分析與理解。 正

【imx6ul】U-Boot 2016.03執行過程分析-ARM Cortex-A7

uboot組織架構正在朝著linux架構方向發展,不同版本稍有不同,一下以U-Boot 2016.03為例。分析入口:以u-boot.lds(其決定了各個段的排布方式)開始:1、u-boot.lds://設定輸出檔案大小端格式 OUTPUT_FORMAT("elf32-lit

U-boot初始化階段流程分析

U-boot的初始化主要分為兩個階段 第一階段:主要是SOC內部的初始化,板級的初始化比較少,所以移植的修改量比較小。此階段由組合語言編寫,程式碼主體分佈在start.S和lowlevel_init.S中。 其中start.S作為主幹,其主要流程為: 注:

Springboot原始碼分析專案結構

摘要: 無論是從IDEA還是其他的SDS開發工具亦或是https://start.spring.io/ 進行解壓,我們都會得到同樣的一個pom.xml檔案 xml <?xml version="1.0" encoding="UTF-8"?> <project xm

JFinal源碼 分析 Core包分析

代碼 types nmap null 可能 tool oca 開發 rep ActionHandler.java   這個類繼承了上面 說的Handler類,首先我們 上 幾個屬性 ,下面幾個 屬性我們 需要 關心哪些東西 呢?首先 是ActionMapping和Rend

【kubernetes/k8s原始碼分析】kubelet原始碼分析cdvisor原始碼分析

  資料流 UnsecuredDependencies -> run   1. cadvisor.New初始化 if kubeDeps.CAdvisorInterface == nil { imageFsInfoProvider := cadv

統計分析單因素分析、多因素分析(多指標聯合分析)與ROC曲線的繪製——附SPSS操作指南

Q1.什麼是單因素分析和多因素分析?         單因素分析(monofactor analysis)是指在一個時間點上對某一變數的分析。目的在於描述事實。         多因素分析亦稱“多因素指數體系

Loadrunner測試結果分析資料過濾分析

測試方法:按照“一般日間聯機交易和預約轉賬測試模型”規定的交易和配比,採用vu等比壓力梯度遞增方式施壓,壓力增長直至出現系統瓶頸或資源超過安全範圍為止。 其他的測試策略可以參考:http://blog.51cto.com/372550/2068876而在綜合性混合場景進行壓力測試下,如果通過loadru

U-boot移植配置及編譯詳解 1

1.Uboot 的配置過程主要涉及四個檔案:   uboot/makefile   uboot/mkconfig  uboot/config.mk  uboot/board/samsung/smdkc110/u-boot.lds   2

Android7.0原始碼分析Binder——Client分析

Binder  Client分析,咋一看,就那麼四個關鍵方法:getService()、addService()、checkService()、listServices()。四個方法原理都差不多,以下僅

3D分析可見性分析工具

ArcGIS 通過分析功能面的視域來確定不同區域中的可見性。 視域的計算:如果僅有一個觀測點,則為可從觀測點看到的單元賦值 1,為無法從觀測點看到的所有單元賦值 0。 1. Construct