关键词:
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的最终目标为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
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... 查看详情