uboot 2013.04版編譯過程及原理說明

使用如何閱讀U-Boot的Makefile中的方法我們同樣可以獲取make_boot_compile.log.1,下面是其中內(nèi)容的詳細(xì)解釋凉馆。

目標(biāo)autoconf.mk和autoconf.mk.dep

make[1]: Entering directory `/disk2/boot'
Generating include/autoconf.mk
Generating include/autoconf.mk.dep
make[1]: Leaving directory `/disk2/boot'

boot/Makefile中有

all:
sinclude $(obj)include/autoconf.mk.dep
sinclude $(obj)include/autoconf.mk

雖然boot/Makefile中有兩個(gè)all目標(biāo),但是在執(zhí)行make時(shí)首先會(huì)執(zhí)行第一個(gè)all挂疆,第一個(gè)all目標(biāo)只是說明了sinclude兩個(gè)文件硼端,這兩個(gè)文件在下面有創(chuàng)建的規(guī)則,所以會(huì)直接執(zhí)行這兩個(gè)目標(biāo)醋安。

autoconf.mk

$(obj)include/autoconf.mk: $(obj)include/config.h
    @$(XECHO) Generating $@ ; \
    set -e ; \
    : Extract the config macros ; \
    $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \
        sed -n -f tools/scripts/define2mk.sed > $@.tmp && \
    mv $@.tmp $@

依賴include/config.hXECHO根據(jù)環(huán)境變量中是否有s靜默模式賦值為echo或者:墓毒,:表示注釋吓揪,CPPgcc -E,表示展開宏所计,定義在config.mk柠辞。-dM include/common.h表示展開文件中的宏,利用腳本define2mk.sed將宏定義轉(zhuǎn)換成CONFIG_SYS_SPI_U_BOOT_OFFS=0x20000主胧。

include/config.h在U-boot配置時(shí)創(chuàng)建叭首。

autoconf.mk.dep

$(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h
    @$(XECHO) Generating $@ ; \
    set -e ; \
    : Generate the dependancies ; \
    $(CC) -x c -DDO_DEPS_ONLY -M $(CFLAGS) $(CPPFLAGS) \
        -MQ $(obj)include/autoconf.mk include/common.h > $@

依賴include/config.hinclude/common.h,提取所有依賴的頭文件踪栋。

目標(biāo)all

這里的目標(biāo)all指的是第二個(gè)

all:        $(ALL-y) $(SUBDIR_EXAMPLES)

只有依賴文件焙格,沒有命令,所以只需要關(guān)注變量$(ALL-y)$(SUBDIR_EXAMPLES)

ALL-y

ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)u-boot.dis $(obj)System.map
ALL-$(CONFIG_SPL) += $(obj)spl/u-boot-spl.bin

有兩種賦值形式己英,需要了解的是第二種间螟,根據(jù)宏是否定義為y來決定ALL-y是否包含吴旋。

u-boot.srec

繼續(xù)看make_boot_compile.log.1

 文件“all”不存在损肛。
   文件“u-boot.srec”不存在。
     文件“u-boot”不存在荣瑟。
...
  必須重新創(chuàng)建目標(biāo)“u-boot.srec”治拿。
/disk2/cross_compiler/bin/arm-buildroot-linux-uclibcgnueabi-objcopy -O srec u-boot u-boot.srec
  重新創(chuàng)建目標(biāo)文件“u-boot.srec”成功。

對(duì)應(yīng)的makefile內(nèi)容是

$(obj)u-boot.srec:  $(obj)u-boot
        $(OBJCOPY) -O srec $< $@
u-boot[重要]
     文件“u-boot”不存在笆焰。
       文件“depend”不存在劫谅。
        ...
      重新創(chuàng)建目標(biāo)文件“depend”成功。
        ...
cd /disk2/boot && /disk2/cross_compiler/bin/arm-buildroot-linux-uclibcgnueabi-ld  -pie -T u-boot.lds -Bstatic -Ttext 0x4ff00000 arch/arm/cpu/arm920t/start.o --start-group arch/arm/cpu/arm920t/libarm920t.o arch/arm/lib/libarm.o common/libcommon.o drivers/crypto/libcrypto.o drivers/i2c/libi2c.o drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o drivers/mtd/spi/libspi_flash.o drivers/net/libnet.o drivers/net/phy/libphy.o drivers/rtc/librtc.o drivers/serial/libserial.o drivers/spi/libspi.o drivers/usb/ulpi/libusb_ulpi.o lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o lib/zlib/libz.o net/libnet.o board/samsung/smdk2440/libsmdk2440.o --end-group /disk2/boot/arch/arm/lib/eabi_compat.o  -L /disk2/cross_compiler/cross_compiler/bin/../lib/gcc/arm-linux-gcc/4.7.2 -lgcc -Map u-boot.map -o u-boot
    重新創(chuàng)建目標(biāo)文件“u-boot”成功。

對(duì)應(yīng)Makefile的代碼

GEN_UBOOT = \
        cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
            $(__OBJS) \
            --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
            -Map u-boot.map -o u-boot

$(obj)u-boot:   depend \
        $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
        $(GEN_UBOOT)

依賴文件是depend捏检、$(SUBDIR_TOOLS)荞驴、$(OBJS)$(LIBBOARD)贯城、$(LIBS)熊楼、$(LDSCRIPT)$(obj)u-boot.lds,待這些依賴文件全部更新后執(zhí)行$(GEN_UBOOT)能犯。

下面我們對(duì)每一個(gè)進(jìn)行分析

depend

Makefile內(nèi)容

depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) \
        $(obj)include/autoconf.mk \
        $(obj)include/generated/generic-asm-offsets.h \
        $(obj)include/generated/asm-offsets.h
        for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do \
            $(MAKE) -C $$dir _depend ; done
  1. TIMESTAMP_FILE是時(shí)間戳文件include/generated/timestamp_autogenerated.h鲫骗;
  2. VERSION_FILE是版本信息,包括boot的版本信息踩晶、arm-linux-gccarm-linux-ld的版本信息执泰;
  3. include/autoconf.mk之前已經(jīng)分析過了;
  4. lib/asm-offsets.c中定義了global_data結(jié)構(gòu)體的一些信息渡蜻,利用該文件生成lib/asm-offsets.s术吝,再利用tools/scripts/make-asm-offsetslib/asm-offsets.s生成include/generated/generic-asm-offsets.h
  5. 利用$(src)$(CPUDIR)/$(SOC)/asm-offsets.c生成$(CPUDIR)/$(SOC)/asm-offsets.s晴楔,不存在則該文件為空顿苇,再利用tools/scripts/make-asm-offsets$(CPUDIR)/$(SOC)/asm-offsets.s生成include/generated/asm-offsets.h
  6. 對(duì)tools税弃、arch/arm/cpu/arm920t/disk2/boot/board/samsung/smdk2440/分別執(zhí)行make -C $dir _depend纪岁,將在這些目錄下生成.depend文件,內(nèi)容是.c文件編譯時(shí)所依賴的頭文件则果。
$(SUBDIR_TOOLS)

在boot下面的Makefile中SUBDIR_TOOLS = tools幔翰。

TOOLSUBDIRS = 

BIN_FILES-$(CONFIG_BUILD_ENVCRC) += envcrc$(SFX)
BINS    := $(addprefix $(obj),$(sort $(BIN_FILES-y)))
all:    $(obj).depend $(BINS) $(LOGO-y) subdirs

$(obj)envcrc$(SFX): $(obj)crc32.o $(obj)env_embedded.o $(obj)envcrc.o $(obj)sha1.o
    $(HOSTCC) $(HOSTCFLAGS) $(HOSTLDFLAGS) -o $@ $^

subdirs:
ifeq ($(TOOLSUBDIRS),)
    @:
else
    @for dir in $(TOOLSUBDIRS) ; do \
        $(MAKE) \
        HOSTOS=$(HOSTOS) \
        HOSTARCH=$(HOSTARCH) \
        -C $$dir || exit 1 ; \
    done
endif

.depend之前已經(jīng)更新了;BIN表示諸如envcrc的可執(zhí)行文件西壮,在boot/rules.mk中關(guān)于.c編譯成.o遗增;LOGO-y表示頭文件;subdirs表示其他需要編譯的目錄款青,這里定義是空做修。

$(HOSTOBJS): $(obj)%.o: %.c
    $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c

tool中的可執(zhí)行文件使gcc編譯的,也就是說這些工具是在

$(OBJS)

boot/MakefileOBJS的定義是arch/arm/cpu/arm920t/start.o

OBJS  = $(CPUDIR)/start.o
OBJS := $(addprefix $(obj),$(OBJS))
$(OBJS):    depend
        $(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))

執(zhí)行的命令等同于

make -C arch/arm/cpu/arm920t start.o

對(duì)應(yīng)make_boot_compile.log.1中的內(nèi)容

       文件“arch/arm/cpu/arm920t/start.o”不存在抡草。
      必須重新創(chuàng)建目標(biāo)“arch/arm/cpu/arm920t/start.o”饰及。
make -C arch/arm/cpu/arm920t start.o

 文件“start.o”不存在。
必須重新創(chuàng)建目標(biāo)“start.o”康震。
make[2]: Entering directory `/disk2/boot/arch/arm/cpu/arm920t'
/disk2/cross_compiler/bin/arm-linux-gcc   -D__ASSEMBLY__ -g  -Os   -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DCONFIG_SYS_TEXT_BASE=0x4ff00000 -DCONFIG_SPL_TEXT_BASE=0x200000 -DCONFIG_SPL_PAD_TO=0 -I/disk2/boot/include -fno-builtin -ffreestanding -nostdinc -isystem /disk2/cross_compiler/cross_compiler/bin/../lib/gcc/arm-linux-gcc/4.7.2/include -pipe  -DCONFIG_ARM -D__ARM__ -marm -mno-thumb-interwork -mabi=aapcs-linux -march=armv5   -o start.o start.S -c
重新創(chuàng)建目標(biāo)文件“start.o”成功燎含。
$(LIBBOARD)
LIBS-y += lib/libgeneric.o
LIBS-y += lib/lzma/liblzma.o
...
LIBS-y += $(CPUDIR)/$(SOC)/lib$(SOC).o
LIBS := $(addprefix $(obj),$(sort $(LIBS-y)))

SUBDIR_TOOLS = tools
LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).o
LIBBOARD := $(addprefix $(obj),$(LIBBOARD))

$(LIBS):    depend $(SUBDIR_TOOLS)
        $(MAKE) -C $(dir $(subst $(obj),,$@))

$(LIBBOARD):    depend $(LIBS)
        $(MAKE) -C $(dir $(subst $(obj),,$@))

依賴文件是depend$(LIBS)depend之前已經(jīng)更新過了腿短,所以這里只需要考慮$(LIBS)的更新屏箍。根據(jù)(LIBS)的定義可以看出是.o文件绘梦,編譯的方法類似于

make -C arch/arm/cpu/arm920t/

LIBBOARD的定義是board/samsung/smdk2440/libsmdk2440.o,因此編譯的命令相當(dāng)于

make -C board/samsung/smdk2440/
$(LIBS)

之前更新$(LIBBOARD)時(shí)已經(jīng)更新過了赴魁。

$(LDSCRIPT)
    ifeq ($(wildcard $(LDSCRIPT)),)
        LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
    endif

對(duì)應(yīng)make_boot_compile.log.1

       目標(biāo)“/disk2/boot/board/samsung/smdk2440/u-boot.lds”的前提“depend”不存在卸奉。
      必須重新創(chuàng)建目標(biāo)“/disk2/boot/board/samsung/smdk2440/u-boot.lds”。
make -C /disk2/boot/board/samsung/smdk2440/ u-boot.lds

u-boot.lds文件存在颖御,不需要更新择卦。

$(obj)u-boot.lds

boot/Makefile

$(obj)u-boot.lds: $(LDSCRIPT)
        $(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$< >$@

對(duì)應(yīng)make_boot_compile.log.1

文件“u-boot.lds”不存在。
      必須重新創(chuàng)建目標(biāo)“u-boot.lds”郎嫁。
/disk2/cross_compiler/bin/arm-linux-gcc -E -g  -Os   -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DCONFIG_SYS_TEXT_BASE=0x4ff00000 -DCONFIG_SPL_TEXT_BASE=0x200000 -DCONFIG_SPL_PAD_TO=0 -I/disk2/boot/include -fno-builtin -ffreestanding -nostdinc -isystem /disk2/cross_compiler/cross_compiler/bin/../lib/gcc/arm-linux-gcc/4.7.2/include -pipe  -DCONFIG_ARM -D__ARM__ -marm -mno-thumb-interwork -mabi=aapcs-linux -march=armv5 -include /disk2/boot/include/u-boot/u-boot.lds.h -DCPUDIR=arch/arm/cpu/arm920t  -ansi -D__ASSEMBLY__ -P - </disk2/boot/board/samsung/smdk2440/u-boot.lds >u-boot.lds
      重新創(chuàng)建目標(biāo)文件“u-boot.lds”成功秉继。

u-boot.bin

   文件“u-boot.bin”不存在。
  必須重新創(chuàng)建目標(biāo)“u-boot.bin”泽铛。
/disk2/cross_compiler/bin/arm-buildroot-linux-uclibcgnueabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
  重新創(chuàng)建目標(biāo)文件“u-boot.bin”成功尚辑。

對(duì)應(yīng)的makefile內(nèi)容是

$(obj)u-boot.bin:   $(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
        $(BOARD_SIZE_CHECK)

u-boot.bin用于燒寫。

u-boot.dis

   文件“u-boot.dis”不存在盔腔。
  必須重新創(chuàng)建目標(biāo)“u-boot.dis”杠茬。
/disk2/cross_compiler/bin/arm-buildroot-linux-uclibcgnueabi-objdump -d u-boot > u-boot.dis
  重新創(chuàng)建目標(biāo)文件“u-boot.dis”成功。

對(duì)應(yīng)的makefile內(nèi)容是

$(obj)u-boot.dis:   $(obj)u-boot
        $(OBJDUMP) -d $< > $@

反匯編u-boot弛随,u-boot.dis一般用于定位問題瓢喉。

System.map

   文件“System.map”不存在。
  必須重新創(chuàng)建目標(biāo)“System.map”舀透。
  重新創(chuàng)建目標(biāo)文件“System.map”成功栓票。

對(duì)應(yīng)的makefile內(nèi)容是

SYSTEM_MAP = \
        $(NM) $1 | \
        grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
        LC_ALL=C sort
$(obj)System.map:   $(obj)u-boot
        @$(call SYSTEM_MAP,$<) > $(obj)System.map

依賴文件u-boot,命令是$(call SYSTEM_MAP,$<) > $(obj)System.map愕够,等同于

$(CROSS_COMPILE)nm u-boot | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
LC_ALL=C sort > System.map

生成符號(hào)表System.map走贪。

spl/u-boot-spl.bin

$(obj)spl/u-boot-spl.bin:   $(SUBDIR_TOOLS) depend
        $(MAKE) -C spl all

SUBDIR_EXAMPLES

例子所在的文件夾,可以直接注釋掉

SUBDIR_EXAMPLES = examples/standalone examples/api
Image 1.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惑芭,一起剝皮案震驚了整個(gè)濱河市坠狡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遂跟,老刑警劉巖逃沿,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幻锁,居然都是意外死亡凯亮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門越败,熙熙樓的掌柜王于貴愁眉苦臉地迎上來触幼,“玉大人硼瓣,你說我怎么就攤上這事究飞≈们” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵亿傅,是天一觀的道長媒峡。 經(jīng)常有香客問我,道長葵擎,這世上最難降的妖魔是什么谅阿? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮酬滤,結(jié)果婚禮上签餐,老公的妹妹穿的比我還像新娘。我一直安慰自己盯串,他們只是感情好氯檐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著体捏,像睡著了一般冠摄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上几缭,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天河泳,我揣著相機(jī)與錄音,去河邊找鬼年栓。 笑死拆挥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的某抓。 我是一名探鬼主播竿刁,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搪缨!你這毒婦竟也來了食拜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤副编,失蹤者是張志新(化名)和其女友劉穎负甸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痹届,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呻待,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了队腐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚕捉。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柴淘,靈堂內(nèi)的尸體忽然破棺而出迫淹,到底是詐尸還是另有隱情秘通,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布敛熬,位于F島的核電站肺稀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏应民。R本人自食惡果不足惜话原,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诲锹。 院中可真熱鬧繁仁,春花似錦、人聲如沸归园。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔓倍。三九已至悬钳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偶翅,已是汗流浹背默勾。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聚谁,地道東北人母剥。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像形导,于是被迫代替她去往敵國和親环疼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容