u-boot顶层makefile分析

天地有大美而不言 天地有大美而不言     2022-08-20     435

关键词:

1.u-boot制作命令

make forlinx_nand_ram256_config;

make all;

2.顶层mkconfig分析,参考 U-BOOT顶层目录mkconfig分析

mkconfig脚本执行后会生成以下3个文件,这些文件中提供的变量会在Makefile中其它地方使用。

MKCONFIG    := $(SRCTREE)/mkconfig

forlinx_nand_ram256_config :  unconfig
    @$(MKCONFIG) smdk6410 arm s3c64xx smdk6410 samsung s3c6410 NAND ram256
    
unconfig:
    @rm -f $(obj)include/config.h $(obj)include/config.mk \
        $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp

./include/config.mk

./board/samsung/smdk6410/config.mk

./include/config.h

3.顶层config.mk分析,参考 u-boot顶层目录config.mk分析

这个文件设置的变量会在Makefile其它地方使用。

# load ARCH, BOARD, and CPU configuration
include $(OBJTREE)/include/config.mk
export    ARCH CPU BOARD VENDOR SOC

4.变量打印,修改Makefile查看变量的具体内容。

display1:
    @echo "PLATFORM_RELFLAGS : $(PLATFORM_RELFLAGS)"
    @echo "PLATFORM_CPPFLAGS : $(PLATFORM_CPPFLAGS)"
    @echo "CPPFLAGS : $(CPPFLAGS)"
    @echo "CFLAGS : $(CFLAGS)"
    @echo "AFLAGS : $(AFLAGS)"
    @echo "LDFLAGS : $(LDFLAGS)"
    @echo "CPP: $(CPP)"
    @echo "MAKE: $(MAKE)"
    @echo "CROSS_COMPILE: $(CROSS_COMPILE)"
    @echo "BOARDDIR : $(BOARDDIR)"
    @echo "HOSTCC : $(HOSTCC)"
    @echo "HOSTCFLAGS : $(HOSTCFLAGS)"
    @echo "ALL : $(ALL)"
    @echo "SUBDIRS : $(SUBDIRS)"
    @echo "OBJS : $(OBJS)"
    @echo "__OBJS : $(__OBJS)"
    @echo "LIBS : $(LIBS)"
    @echo "__LIBS : $(__LIBS)"
    @echo "LDSCRIPT: $(LDSCRIPT)"

执行make display1即可查看到各个变量的具体值如下:

 1 PLATFORM_RELFLAGS :  -fno-strict-aliasing  -fno-common -ffixed-r8 -msoft-float 
 2 PLATFORM_CPPFLAGS :  -DCONFIG_ARM -D__ARM__ -march=armv5t
 3 CPPFLAGS : -g  -Os   -fno-strict-aliasing  -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DTEXT_BASE=0xCFE00000  -I/home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/include -pipe  -DCONFIG_ARM -D__ARM__ -march=armv5t
 4 CFLAGS : -g  -Os   -fno-strict-aliasing  -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DTEXT_BASE=0xCFE00000  -I/home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/include -pipe  -DCONFIG_ARM -D__ARM__ -march=armv5t -Wall -Wstrict-prototypes
 5 AFLAGS :  -D__ASSEMBLY__ -g  -Os   -fno-strict-aliasing  -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DTEXT_BASE=0xCFE00000  -I/home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/include -pipe  -DCONFIG_ARM -D__ARM__ -march=armv5t
 6 LDFLAGS : -Bstatic -T /home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds -Ttext 0xCFE00000 
 7 CPP: /usr/local/arm/4.3.2/bin/arm-linux-gcc -E
 8 MAKE: make
 9 CROSS_COMPILE: /usr/local/arm/4.3.2/bin/arm-linux-
10 BOARDDIR : samsung/smdk6410
11 HOSTCC : gcc
12 HOSTCFLAGS : -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
13 ALL : u-boot.srec u-boot.bin System.map 
14 SUBDIRS : tools examples post post/cpu
15 OBJS : cpu/s3c64xx/start.o
16 __OBJS : cpu/s3c64xx/start.o
17 LIBS : lib_generic/libgeneric.a board/samsung/smdk6410/libsmdk6410.a cpu/s3c64xx/libs3c64xx.a cpu/s3c64xx/s3c6410/libs3c6410.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/onenand/libonenand.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a
18 __LIBS : lib_generic/libgeneric.a board/samsung/smdk6410/libsmdk6410.a cpu/s3c64xx/libs3c64xx.a cpu/s3c64xx/s3c6410/libs3c6410.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/onenand/libonenand.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a
19 LDSCRIPT: /home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds
make display1

从上面可以看出make的最终目标为ALL : u-boot.srec u-boot.bin System.map 

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
all:        $(ALL)

 u-boot.srec u-boot.bin都依赖于u-boot

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

$(obj)u-boot.bin:    $(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
        $(OBJDUMP) -d $< > $<.dis
        
$(obj)System.map:    $(obj)u-boot
        @$(NM) $< | \
        grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
        sort > $(obj)System.map

5. make u-boot分析,参考 详细分析make uboot 最后的编译链接的具体执行过程

$(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

上述目标的生成可分解为4个步骤:

5.0 生成版本信息文件:

生成include/version_autogenerated.h文件,内容如下:

#define U_BOOT_VERSION "U-Boot 1.1.6"

 

version:
        @echo -n "#define U_BOOT_VERSION \"U-Boot " > $(VERSION_FILE); \
        echo -n "$(U_BOOT_VERSION)" >> $(VERSION_FILE); \
        echo -n $(shell $(CONFIG_SHELL) $(TOPDIR)/tools/setlocalversion \
             $(TOPDIR)) >> $(VERSION_FILE); \
        echo "\"" >> $(VERSION_FILE)

VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 6
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

5.1 确定UNDEF_SYM变量值

打印出UNDEF_SYM变量值如下,其中的-u__u_boot_cmd_xxx用作arm-linux-ld命令的参数,意思就是,在ld的时候不定义这些符号,即不定义__u_boot_cmd_xxx,等等这些符号,我的理解是因为开始需要从某个库中载入其他的符号,而这个时候还没有载入到那个包含此符号定义的库,所以暂时先加入这个-u说明,先不定义这些符号,等到所有的库都加载完了再去找这些符号的定义,此时已经加载完所有的库了,也就能找到这些符号的定义了。

-u__u_boot_cmd_base
-u__u_boot_cmd_bdinfo
-u__u_boot_cmd_bootelf
-u__u_boot_cmd_bootm
-u__u_boot_cmd_bootp
-u__u_boot_cmd_bootvx
-u__u_boot_cmd_branch
-u__u_boot_cmd_cmp
-u__u_boot_cmd_cp
-u__u_boot_cmd_crc32
-u__u_boot_cmd_date
-u__u_boot_cmd_dcache
-u__u_boot_cmd_dnw
-u__u_boot_cmd_echo
-u__u_boot_cmd_end
-u__u_boot_cmd_erase
-u__u_boot_cmd_exit
-u__u_boot_cmd_fatinfo
-u__u_boot_cmd_fatload
-u__u_boot_cmd_fatls
-u__u_boot_cmd_flinfo
-u__u_boot_cmd_go
-u__u_boot_cmd_help
-u__u_boot_cmd_icache
-u__u_boot_cmd_imls
-u__u_boot_cmd_itest
-u__u_boot_cmd_loadb
-u__u_boot_cmd_loads
-u__u_boot_cmd_loady
-u__u_boot_cmd_loop
-u__u_boot_cmd_md
-u__u_boot_cmd_mm
-u__u_boot_cmd_movi
-u__u_boot_cmd_mtest
-u__u_boot_cmd_mw
-u__u_boot_cmd_nand
-u__u_boot_cmd_nboot
-u__u_boot_cmd_nfs
-u__u_boot_cmd_nm
-u__u_boot_cmd_ping
-u__u_boot_cmd_printenv
-u__u_boot_cmd_protect
-u__u_boot_cmd_question_mark
-u__u_boot_cmd_rarpboot
-u__u_boot_cmd_reset
-u__u_boot_cmd_saveenv
-u__u_boot_cmd_setenv
-u__u_boot_cmd_sleep
-u__u_boot_cmd_start
-u__u_boot_cmd_test
-u__u_boot_cmd_tftpboot
-u__u_boot_cmd_usb
-u__u_boot_cmd_version
UNDEF_SYM:

5.2 切换到u-boot顶层目录

5.3 arm-linux-ld链接生成最终elf类型的u-boot。

这里要注意连接器脚本文件u-boot.lds

LDFLAGS : -Bstatic -T /home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds -Ttext 0xCFE00000

从其中可以发现cpu/s3c64xx/start.S是u-boot执行的第一个文件,后面就从这个函数入手分析u-boot的启动流程。

 1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 2 /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
 3 OUTPUT_ARCH(arm)
 4 ENTRY(_start)
 5 SECTIONS
 6 {
 7     . = 0x00000000;
 8 
 9     . = ALIGN(4);
10     .text      :
11     {
12       cpu/s3c64xx/start.o    (.text)
13       cpu/s3c64xx/s3c6410/cpu_init.o    (.text)
14       cpu/s3c64xx/onenand_cp.o    (.text)
15       cpu/s3c64xx/nand_cp.o    (.text)
16       cpu/s3c64xx/movi.o (.text)
17       *(.text)
18       lib_arm/div0.o
19     }
20 
21     . = ALIGN(4);
22     .rodata : { *(.rodata) }
23 
24     . = ALIGN(4);
25     .data : { *(.data) }
26 
27     . = ALIGN(4);
28     .got : { *(.got) }
29 
30     __u_boot_cmd_start = .;
31     .u_boot_cmd : { *(.u_boot_cmd) }
32     __u_boot_cmd_end = .;
33 
34     . = ALIGN(4);
35     .mmudata : { *(.mmudata) }
36 
37     . = ALIGN(4);
38     __bss_start = .;
39     .bss : { *(.bss) }
40     _end = .;
41 }

 

嵌入式开发(s5pv210)——u-boot的顶层makefile分析(代码片段)

前言本文分析的是u-boot的主Makefile以及主Makefile调用到的一些关键文件,此Makefile可能和你手里的u-boot的Makefile不一样,这是正常的,但是从逻辑上都是一样的,无非就是把同样功能的脚本放在了不同的位置或者子Ma... 查看详情

u-boot顶层makefile介绍(*)(代码片段)

参考:U-Boot顶层Makefile介绍作者:一只青木呀发布时间:2020-10-2216:22:17网址:https://blog.csdn.net/weixin_45309916/article/details/109218569目录1、准备好uboot源码2、分析顶层Makefile2.1、版本号2.2、MAKEFLAGS变量2.3、 查看详情

linux系统移植:u-boot顶层makefile分析(下)(代码片段)

目录Linux系统移植:U-Boot顶层Makefile分析(下)一、调用scripts/Kbuild.include二、导出交叉编译工具变量设置三、导出其他变量四、makexxx_config过程五、make过程Linux系统移植:U-Boot顶层Makefile分析(下)继续沿着... 查看详情

linux系统移植:u-boot顶层makefile分析(上)(代码片段)

目录Linux系统移植:U-Boot顶层Makefile分析(上)一、版本号二、传递变量到子make三、命令输出四、静默输出五、编译输出目录六、代码检查七、模块编译八、获取主机架构和系统九、设置目标架构、交叉编译器和配置... 查看详情

嵌入式linux7.u-boot顶层makefile分析(代码片段)

...用ifeq来判断"$(originV)"和"commandline"是否相等。这里用到了Makefile中的函数originorigin和其他的函数不一样,它不操作变量的值, 查看详情

嵌入式linux7.u-boot顶层makefile分析(代码片段)

1.版本号5VERSION=20166PATCHLEVEL=037SUBLEVEL=8EXTRAVERSION=9NAME=VERSION是主版本号,PATCHLEVEL是补丁版本号,SUBLEVEL是次版本号,这三个一起构成了uboot的版本号,比如当前的uboot版本号就是“2016.03”。EXTRAVERSION是附加版本信息,NAME是和名字有... 查看详情

嵌入式开发(s5pv210)——u-boot的顶层config.mk分析(代码片段)

...路径等,但是config.mk的配置是建立在顶层mkconfig、主Makefile等配置之上的。2、config.mk的调用#loadotherconfigurationinclude$(TOPDI 查看详情

u-boot-2016.07移植(第一篇)初步分析

...m-linux-gcc443安装环境Ubuntu910下载u-boot-201607并解压分析顶层Makefile1找出目标依赖关系2总结初次编译u-boot1配置2编译分析u-boot启动流程1分析startS 查看详情

分析u-boot的makefile

  这里分析三星s5pv210芯片官方u-boot 先看u-boot版本号VERSION=1      #主版本号PATCHLEVEL=3  #次版本号SUBLEVEL=4    #修改正版本号EXTRAVERSION=  #拓展版本号 U_BOOT_VERSION=$(VERSION).$(PATCHLEVEL).$(SUBL 查看详情

tiny4412u-boot分析u-boot配置流程分析

...maketiny4412_configmake这个过程主要涉及到两个文件,顶层的Makefile文件和mkconfig文件,makeconfig文件是一个脚本,通过文件的注释可以了解到它的作用#Scripttocreateheaderfilesandlinkstoconfigure#U-Bootforaspecificboard.##Para 查看详情

u-boot主makefile详尽分析

U-boot主Makefile详尽分析主Makefile位于uboot源码的根目录下,其内容主要结构为:1.确定版本号及主机信息(23至48行)2.实现静默编译功能(48至55行)3.设置各种路径(56至123行)4.设置编译工具链(124至186行,大部分在config.mk内)5.... 查看详情

顶层makefile分析(代码片段)

1.顶层目录下的Makefile        OpenHarmony/kernel/liteos_a/Makefile-include$(LITEOSTOPDIR)/tools/build/config.mk#包含kernel/liteos_a/tools/build/config.mkLITEOS_TARGET=liteosLITEOS_PLATFORM_BASE=$(LITE 查看详情

u-boot顶层目录config.mk分析

1.设置obj与srcifneq($(OBJTREE),$(SRCTREE))ifeq($(CURDIR),$(SRCTREE))dir:=elsedir:=$(subst$(SRCTREE)/,,$(CURDIR))endifobj:=$(if$(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)src:=$(if$(dir),$(SRCTREE)/$(dir)/,$(SR 查看详情

u-boot全面分析

 uboot主Makefile分析1ubootversion确定(Makefile的24-29行)HOSTARCH和HOSTOS(Makefile的31-43行)静默编译(50-54行)2种编译方法(原地编译和单独输出文件夹编译)编译方法实践两种编译的实现(Makefile的78-123行)include$(obj)include/config.mk... 查看详情

uboot主makefile解析

...nfig,make的时候都作了那些动作呢,这里我先大概介绍一下Makefile的内容,然后在大概理解一下命令执行的流程。如果有错的地方,希望大家指正,谢谢。1.u-boot顶层目录的Makefile分析:HOSTARCH:=$(shelluname-m|      &... 查看详情

linux系统移植:kernel顶层makefile(下)(代码片段)

文章目录Linux系统移植:Kernel顶层Makefile(下)一、makedefconfig过程二、Makefile.build脚本分析三、make过程四、built-in.o文件编译生成过程五、makezImage过程Linux系统移植:Kernel顶层Makefile(下)继续分析Linux内核... 查看详情

嵌入式开发(s5pv210)——u-boot的顶层mkconfig文件分析(代码片段)

mkconfig文件的调用#第一步:SRCTREE是源码的路径,也就是顶层的目录MKCONFIG :=$(SRCTREE)/mkconfigexportMKCONFIG#第二步:配置#$(@:_config=):作用是将x210_sd_config的_config去掉,得到x210_sdx210_sd_c 查看详情

u-boot-2015.07autoconf.mk生成过程分析(代码片段)

....config文件。 2、autoconf.mk的生成过程在顶层目录下的Makefile中:…1110quiet_cmd_autoconf_dep=GEN[email protected]#log中打印:GENinclude/autoconf.mk.dep1111cmd_autoconf_dep=$(CC)-xc-DDO_DEPS_ONLY-M$(c_flags)1112-MQinclude/autoconf.mk$(srctree)/include/common.h>[ema... 查看详情