uboot的配置和編譯檔案解析
Makefile分析
版本確定
在檔案開頭的幾行就是版本號:
VERSION = 1 // 主版本號
PATCHLEVEL = 3 // Patch版本號
SUBLEVEL = 4 // 次版本號
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
版本號最終生成一個U_BOOT_VERSION的變數,用於確定最終的版本號,VERSION_FILE這個檔案在編譯過程中自動生成,內容是一個值為版本號的巨集定義。
HOST配置
緊接著是HOST的配置:
HOSTARCH := $(shell uname -m | \
sed -e s/i.86/i386/ \
-e s/sun4u/sparc64/ \
-e s/arm.*/arm/ \
-e s/sa110/arm/ \
-e s/powerpc/ppc/ \
-e s/ppc64/ppc/ \
-e s/macppc/ppc/)
# 在shell中執行命令“uname -m”,並用管道連線sed命令,“sed -e s/p1/p2” 命令是把p1替換成p2,其中“.”和“*”是萬用字元,分別匹配一個和多個字元
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')
# 獲取作業系統的名稱,轉成小寫
export HOSTARCH HOSTOS
HOSTARCH 表示主機CPU的架構,HOSTOS 表示主機的作業系統。
靜默編譯
平時編譯的時候命令列會打印出編譯日誌資訊,配置引數在下面的程式碼中:
# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
# 在MAKEFLAGS中尋找-s,如果有,定義列印語句,如果沒有,列印指令為空
編譯方法
uboot有兩種編譯方式,原地編譯和單獨輸出資料夾編譯,預設是原地編譯,編譯出來的結果放在原始檔相同的目錄中。單獨輸出資料夾在編譯時另外指定一個目錄,編譯生成檔案都放置在該目錄中。有兩種方式指定輸出目錄:
#########################################################################
#
# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported:
#
# 1) Add O= to the make command line 在編譯命令中增加一個名為O的引數,指向要輸出的目錄
# 'make O=/tmp/build all'
#
# 2) Set environement variable BUILD_DIR to point to the desired location 設定環境變數BUILD_DIR為要輸出的目錄路徑
# 'export BUILD_DIR=/tmp/build'
# 'make'
#
# The second approach can also be used with a MAKEALL script
# 'export BUILD_DIR=/tmp/build'
# './MAKEALL'
#
# Command line 'O=' setting overrides BUILD_DIR environent variable. 兩個都指定的話O會覆蓋BUILD_DIR
#
# When none of the above methods is used the local build is performed and
# the object files are placed in the source directory.
#
以後的程式碼就是針對於兩種編譯方式的變數定義以及實現,其中有幾個環境變數需要明白:
- OBJTREE:編譯出的目標檔案存放的根目錄,不同的編譯方式中,該目錄的位置不一樣。
- SRCTREE:原始碼的根目錄。
配置編譯環境
實現程式碼中,include $(obj)include/config.mk
這句程式碼用於包含架構,CPU以及開發板的配置資訊,config.mk檔案在配置後才會生成,隨後會將其中的配置資訊匯出到環境變數中:export ARCH CPU BOARD VENDOR SOC
。
- ARCH:編譯目標CPU的架構。
- CROSS_COMPILE:定義交叉編譯工具鏈的字首,在編譯時加上字尾就可以找到工具鏈中的命令。
引入配置指令碼
如下的程式碼:
# load other configuration
include $(TOPDIR)/config.mk
引入了根目錄中的config.mk檔案。
編譯工具的定義
# Include the make variables (CC, etc...)
#
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
LDR = $(CROSS_COMPILE)ldr
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)RANLIB
這些程式碼定義了編譯的工具的位置。
包含開發板的配置引數
# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk
ifdef ARCH
sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rules
endif
ifdef CPU
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules
endif
ifdef SOC
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules
endif
ifdef VENDOR
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)
endif
ifdef BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif
這些語句用於包含開發板,CPU,架構等配置引數,其中autoconfig.mk也是在配置過程中生成的,用於指導uboot的編譯過程,其中的配置會根據條件編譯來影響uboot的編譯走向。這些配置是根據根目錄中“include/configs/xxx.h”中的檔案定義出來的,對應X210開發板的標頭檔案位於:include/configs/x210_sd.h,移植的很大一部分工作也在這個檔案中完成。
連結指令碼
如下程式碼中定義了連結指令碼:
ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif
endif
根據autoconfig中有沒有CONFIG_NAND_U_BOOT來選擇不同的lds連結指令碼檔案,該連結指令碼在uboot編譯的時候連結屬性。
TEXT_BASE
ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif
判斷如果config.mk定義了TEXT_BASE巨集,則加上指定的編譯屬性。TEXT_BASE是一個記憶體地址,是整個uboot連結時指定的連結地址,在X210中該地址是0xc3e00000,因為uboot中啟用了虛擬地址對映,所以0xc3e00000相當於0x23e00000。
自動推導規則
ifndef REMOTE_BUILD
%.s: %.S
$(CPP) $(AFLAGS) -o [email protected] $<
%.o: %.S
$(CC) $(AFLAGS) -c -o [email protected] $<
%.o: %.c
$(CC) $(CFLAGS) -c -o [email protected] $<
else
$(obj)%.s: %.S
$(CPP) $(AFLAGS) -o [email protected] $<
$(obj)%.o: %.S
$(CC) $(AFLAGS) -c -o [email protected] $<
$(obj)%.o: %.c
$(CC) $(CFLAGS) -c -o [email protected] $<
endif
剩餘部分
從此處一直到257行,主要是用於編譯uboot中所有的目標檔案,在291行出現了目標all,直接make的話就是在make這個目標。目標中有一些目標很重要,例如u-boot是最終編譯生成的可執行elf檔案,使用obj-cpy將該檔案轉化為可燒錄檔案u-boot.bin.
unconfig表示未配置,用於作為各個開發板配置目標的依賴,當已經配置過開發板後再次配置時,還可以配置。
uboot配置過程
uboot在配置過程中主要執行的是MakeFile中的如下程式碼:
x210_sd_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
這兩條命令,最終會在指定的目錄位置中建立一個config.mk檔案,該檔案中內容為“TEXT_BASE = 0xc3e00000”。
$(@:_config=)代表替換,$(@代表目標,要把目標中的_config這一部分替換為=號後面的內容,但是後面的內容為空,所以就得到了x210_sd,就是第一個引數,所以第一句中第一個引數是x210_sd,所以就把這幾個引數傳給了mkconfig指令碼。
配置開發板名稱
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
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}" ] || BOARD_NAME="$1"
配置BOARD_NAME為$1,也就是x210_sd。
判斷引數個數
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
如果引數個數不符合就返回,退出配置過程。
建立符號連結
33-118行是為各個不同的架構建立符號連結,使用者給標頭檔案包含提供指向性連線,使uboot具有可移植性。
建立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
檔案位於include/config.mk,是為了讓主Makefile包含進去。
建立config.h
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
檔案內容是包含configs中配置開發板名稱的標頭檔案。是對開發板的巨集定義配置。
uboot連結指令碼
uboot的連結指令碼和裸機程式的連結指令碼本質上並沒有區別。uboot中的連結指令碼是uboot.lds,位於board/samsung/x210目錄中。
ENTRY(_start)
該程式碼用於指定_start為整個程式的入口地址,就是程式的開頭地址,或者是第一句指令。
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/s5pc11x/start.o (.text)
cpu/s5pc11x/s5pc110/cpu_init.o (.text)
board/samsung/x210/lowlevel_init.o (.text)
cpu/s5pc11x/onenand_cp.o (.text)
cpu/s5pc11x/nand_cp.o (.text)
cpu/s5pc11x/movi.o (.text)
common/secure_boot.o (.text)
common/ace_sha1.o (.text)
cpu/s5pc11x/pmic.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
.mmudata : { *(.mmudata) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
指定程式碼段,資料段和bss段。
. = 0x00000000;表示指定該地址為連結地址,其實指定一個程式的連結地址有兩種方法,一種是在MakeFile中ld的flag中使用-Ttext 0x00000020的方式指定連結地址,另外一種是連結一個連結指令碼,在連結指令碼的開頭使用. = 0x00000020方式來指定,這兩種方式是可以配合使用的,如果兩種方式同時使用,以-Ttext指定的為準。
在uboot中我們使用TEXT_BASE值來指定,相當於使用了-Ttext = TEXT_BASE。
. = ALIGN(4);表示使用4位元組的對齊方式。
.text是程式碼段。程式碼段中必須要注意檔案排列的順序,會影響最終生成的可執行程式的排列順序,指出名稱的依次排列,最後使用 *(.text)表示剩餘的部分不指定順序,指定放在前面的檔案,就是必須要放在前16KB內的檔案,這些檔案中的函式在前16KB會被呼叫,後面的檔案中函式順序就無所謂了。
.got,.u_boot_cmd,.mmudata屬於自定義段。
相關推薦
uboot的配置和編譯檔案解析
Makefile分析 版本確定 在檔案開頭的幾行就是版本號: VERSION = 1 // 主版本號 PATCHLEVEL = 3 // Patch版本號 SUBLEVEL = 4 // 次版本號 EXTRAVERSION = U_BOOT
五.linux開發之uboot移植(五)——uboot配置和編譯過程詳解
一.uboot主Makefile分析1 1、uboot version確定(Makefile的24-29行) Makefile程式碼部分 (1)uboo
新版uboot配置、編譯
size www target ref tle 移植 targe font mil 轉載文章來至於: http://www.linuxidc.com/Linux/2015-02/112934.htm新版uboot配置、編譯
php擴展開發筆記(2)多個源代碼文件的配置和編譯
nes repr 過程 http fadein ews add ng- star 我們在開發過程中,為了代碼得可讀性和易維護性,肯定是須要多個代碼文件的,而不不過通過 ext_skel 生成得骨架文件。這篇文章主要介紹下。多個代碼文件的時候。我們須要註意
TensorFlow-GPU環境配置之四——配置和編譯TensorFlow
http mage body class 調用 技術 圖片 環境 進行 首先,使用configure進行配置 配置完成後,使用bazel編譯retrain命令,編譯命令中加入--config=cuda即為啟用GPU 編譯進行中。。。 編譯完成 編譯完成後,調用ret
openwrt針對RT5350代碼下載,配置和編譯
check rip 文件中 自己 squashfs utils sdn 斷網 包括 轉載地址:http://blog.csdn.net/dean_gdp/arti
jfinalQ開發教程04-jfinal配置和jfinalQ檔案結構
jfinalQ 1.前言 有耐心看完前5講的同學,可正真看到jfinalQ到底是什麼了, 前4講說了程式碼生成工具,即:jfinalQ-gencode, 第5講說了加密部署工具,即,jfinalQ-encrypt, 如果對這兩部分感興趣,那麼接下來的內容會更加有趣哦~
Linux3.4核心的基本配置和編譯
瞭解Linux3.4核心的特性及新增功能,掌握Linux核心的編譯過程及Linux核心配置選項的內容。 【實驗環境】 ●主機:Ubuntu 10.10 (64bit); &
nuxus 3在Maven專案的配置和POM檔案的配置
在nuxus 3中的Maven預設會建立三個倉庫,這三個倉庫的關係如下: public是release和snapshot的全集,release預設為關閉狀態,所以在配置nexus 3時需要將其開啟。 下面是具體的配置過程,參考如下: 1、對專案獨立設定: 開啟專
uboot 2018-9 目錄檔案解析
/ arch 體系結構特定檔案 / arc ARC架構 / arm 通用檔案ARM體系結構通用檔案 / m68k 檔案通用於m
《15.核心的配置和編譯原理》
《15.核心的配置和編譯原理》 第一部分、章節目錄 2.15.1.linux核心原始碼目錄結構1 2.15.2.linux核心原始碼目錄結構2 2.15.3.核心配置和編譯體驗 2.15.4.核心的配置原理1 2.15.5.menuconfig的使用和演示 2.15.6.menuconf
uboot 2018-9 目錄檔案解析
/ arch 體系結構特定檔案 / arc ARC架構 / arm 通用檔案ARM體系結構通用檔案 / m68k 檔案通用於m68k體系結構 / microblaze 檔案泛型為microblaze體系結構 / mips
轉 JVM位元組碼命令 反編譯檔案解析
位元組碼 助記符 指令含義 0x00 nop 什麼都不做。 0x01 aconst_null 將 null 推送至棧頂。 0x02 iconst_m1 將 int 型-1 推送至棧頂。 0x03 iconst_0 將 int 型 0 推送至棧頂。 0x04 i
64位配置和編譯
第四講 建立64位的配置 編譯器 首先,你要確定你所使用的Visual Studio的版本允許你編譯程式為64位程式碼。如果你想使用最新的版本(寫本課本時)Visual Studio 2008 來開發64位應用,以下的表格幫助你理解你所需要的Visual Studio 版本。
Android Studio 之 Gradle 安裝配置和編譯
目錄 前言 由於生產力很大一部分取決於生產工具的使用,為了緊跟時代的潮流,我也從Eclipse切換到Android Studio來進行Android開發。 使用Android Studio的時候,最先遇到的難點應該就是Gradle的安裝、配置
Linux核心配置和編譯過程詳解
一、引言: 本文件的內容大部份內容都是從網上收集而來,然後配合一些新的截 圖(核心版本:V2.4.19)。在每一配置項後會有一個選擇指南的部份,用來指導大家怎麼樣 根據自己的情況來做相應的選擇;還有在每一個大項和文件的最後會有一個經驗談,它是一些高手們在應對問題和處理特有
嵌入式 Linux開發Kernel移植(二)——kernel核心配置和編譯
嵌入式 Linux開發Kernel移植(二)——kernel核心配置和編譯 本文選擇linux 2.6.35.7版本kernel進行實踐。一、linux kernel原始碼目錄分析Kbuild,K
如何把核心、uboot、和根檔案系統下載到開發板中
1、首先準備好所需要的檔案:u-boot、uImage、rootfs.img。 2、下載u-boot: tftp 0x40000000 u-boot.bin nand erase 0 0x60000 nand write ox40000000
TensorFlow使用PyCharm編輯器進行配置和編譯在Windows下
遵循:BY-SA 作者:譚東 時間:2017年5月29日 環境:Windows 7 TensorFlow支援很多編輯器,你可以隨便選擇,如Vim、Syder等。這裡我以PyCharm IDE為編輯器進行配置講解。 前提是我們已經在Windows下已經安裝
內核配置和編譯
oot 如果 參考 netd 流程 成了 規模 sel 依賴項 一. 相關重要文件 1.1. Kconfig 1.1.1. 什麽是kconfig文件 a. Kconfig文件分布在各目錄下構成了一個分布式的內核配置數據庫,每個Kconfig分別描述了