1.u-boot制作命令

make forlinx_nand_ram256_config;

make all;

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

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

  1. MKCONFIG := $(SRCTREE)/mkconfig
  2.  
  3. forlinx_nand_ram256_config : unconfig
  4. @$(MKCONFIG) smdk6410 arm s3c64xx smdk6410 samsung s3c6410 NAND ram256
  5.  
  6. unconfig:
  7. @rm -f $(obj)include/config.h $(obj)include/config.mk \
  8. $(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其它地方使用。

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

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

  1. display1:
  2. @echo "PLATFORM_RELFLAGS : $(PLATFORM_RELFLAGS)"
  3. @echo "PLATFORM_CPPFLAGS : $(PLATFORM_CPPFLAGS)"
  4. @echo "CPPFLAGS : $(CPPFLAGS)"
  5. @echo "CFLAGS : $(CFLAGS)"
  6. @echo "AFLAGS : $(AFLAGS)"
  7. @echo "LDFLAGS : $(LDFLAGS)"
  8. @echo "CPP: $(CPP)"
  9. @echo "MAKE: $(MAKE)"
  10. @echo "CROSS_COMPILE: $(CROSS_COMPILE)"
  11. @echo "BOARDDIR : $(BOARDDIR)"
  12. @echo "HOSTCC : $(HOSTCC)"
  13. @echo "HOSTCFLAGS : $(HOSTCFLAGS)"
  14. @echo "ALL : $(ALL)"
  15. @echo "SUBDIRS : $(SUBDIRS)"
  16. @echo "OBJS : $(OBJS)"
  17. @echo "__OBJS : $(__OBJS)"
  18. @echo "LIBS : $(LIBS)"
  19. @echo "__LIBS : $(__LIBS)"
  20. @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/-uboot/uboot_ok6410/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./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/-uboot/uboot_ok6410/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./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/-uboot/uboot_ok6410/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5t
  6. LDFLAGS : -Bstatic -T /home/yjg/arm6410/qudong/-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds -Ttext 0xCFE00000
  7. CPP: /usr/local/arm/4.3./bin/arm-linux-gcc -E
  8. MAKE: make
  9. CROSS_COMPILE: /usr/local/arm/4.3./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/-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds

make display1

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

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

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

  1. $(obj)u-boot.srec: $(obj)u-boot
  2. $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
  3.  
  4. $(obj)u-boot.bin: $(obj)u-boot
  5. $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
  6. $(OBJDUMP) -d $< > $<.dis
  7.  
  8. $(obj)System.map: $(obj)u-boot
  9. @$(NM) $< | \
  10. grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
  11. sort > $(obj)System.map

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

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

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

5.0 生成版本信息文件:

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

  1. #define U_BOOT_VERSION "U-Boot 1.1.6"
  1. version:
  2. @echo -n "#define U_BOOT_VERSION \"U-Boot " > $(VERSION_FILE); \
  3. echo -n "$(U_BOOT_VERSION)" >> $(VERSION_FILE); \
  4. echo -n $(shell $(CONFIG_SHELL) $(TOPDIR)/tools/setlocalversion \
  5. $(TOPDIR)) >> $(VERSION_FILE); \
  6. echo "\"" >> $(VERSION_FILE)
  7.  
  8. VERSION =
  9. PATCHLEVEL =
  10. SUBLEVEL =
  11. EXTRAVERSION =
  12. U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
  13. 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说明,先不定义这些符号,等到所有的库都加载完了再去找这些符号的定义,此时已经加载完所有的库了,也就能找到这些符号的定义了。

  1. -u__u_boot_cmd_base
  2. -u__u_boot_cmd_bdinfo
  3. -u__u_boot_cmd_bootelf
  4. -u__u_boot_cmd_bootm
  5. -u__u_boot_cmd_bootp
  6. -u__u_boot_cmd_bootvx
  7. -u__u_boot_cmd_branch
  8. -u__u_boot_cmd_cmp
  9. -u__u_boot_cmd_cp
  10. -u__u_boot_cmd_crc32
  11. -u__u_boot_cmd_date
  12. -u__u_boot_cmd_dcache
  13. -u__u_boot_cmd_dnw
  14. -u__u_boot_cmd_echo
  15. -u__u_boot_cmd_end
  16. -u__u_boot_cmd_erase
  17. -u__u_boot_cmd_exit
  18. -u__u_boot_cmd_fatinfo
  19. -u__u_boot_cmd_fatload
  20. -u__u_boot_cmd_fatls
  21. -u__u_boot_cmd_flinfo
  22. -u__u_boot_cmd_go
  23. -u__u_boot_cmd_help
  24. -u__u_boot_cmd_icache
  25. -u__u_boot_cmd_imls
  26. -u__u_boot_cmd_itest
  27. -u__u_boot_cmd_loadb
  28. -u__u_boot_cmd_loads
  29. -u__u_boot_cmd_loady
  30. -u__u_boot_cmd_loop
  31. -u__u_boot_cmd_md
  32. -u__u_boot_cmd_mm
  33. -u__u_boot_cmd_movi
  34. -u__u_boot_cmd_mtest
  35. -u__u_boot_cmd_mw
  36. -u__u_boot_cmd_nand
  37. -u__u_boot_cmd_nboot
  38. -u__u_boot_cmd_nfs
  39. -u__u_boot_cmd_nm
  40. -u__u_boot_cmd_ping
  41. -u__u_boot_cmd_printenv
  42. -u__u_boot_cmd_protect
  43. -u__u_boot_cmd_question_mark
  44. -u__u_boot_cmd_rarpboot
  45. -u__u_boot_cmd_reset
  46. -u__u_boot_cmd_saveenv
  47. -u__u_boot_cmd_setenv
  48. -u__u_boot_cmd_sleep
  49. -u__u_boot_cmd_start
  50. -u__u_boot_cmd_test
  51. -u__u_boot_cmd_tftpboot
  52. -u__u_boot_cmd_usb
  53. -u__u_boot_cmd_version

UNDEF_SYM:

5.2 切换到u-boot顶层目录

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

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

  1. LDFLAGS : -Bstatic -T /home/yjg/arm6410/qudong/-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();
  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();
  22. .rodata : { *(.rodata) }
  23.  
  24. . = ALIGN();
  25. .data : { *(.data) }
  26.  
  27. . = ALIGN();
  28. .got : { *(.got) }
  29.  
  30. __u_boot_cmd_start = .;
  31. .u_boot_cmd : { *(.u_boot_cmd) }
  32. __u_boot_cmd_end = .;
  33.  
  34. . = ALIGN();
  35. .mmudata : { *(.mmudata) }
  36.  
  37. . = ALIGN();
  38. __bss_start = .;
  39. .bss : { *(.bss) }
  40. _end = .;
  41. }

u-boot顶层Makefile分析的更多相关文章

  1. TQ210 —— S5PV210 uboot顶层Makefile分析

    转自:http://blog.csdn.net/wqx521/article/details/52469759 # (C) Copyright 2000-2008 # Wolfgang Denk, D ...

  2. uboot 顶层makefile细节分析

    uboot的源文件众多,学习庞然大物首先找到脊椎--顶层的makfile,逐一破解.但是,uboot的makefile同样是一个庞然大物,所以也要找到它的主线.倘若过分专注部分细节,很难做到把握全局, ...

  3. uboot 主Makefile 分析。

    本文以uboot_1.1.6 对应的CPU是S3C2440 为例 uboot_1.1.6 根目录下的主Makefile开头: VERSION = PATCHLEVEL = SUBLEVEL = EXT ...

  4. Android发展的一个重要方面Makefile分析

    Android发展的一个重要方面Makefile分析 随着移动互联网的发展,移动开发也越来越吃香了.眼下最火的莫过于android.android是什么就不用说了,android自从开源以来,就受到非 ...

  5. 内核顶层Makefile相关4

    http://www.groad.net/bbs/simple/?f104.html make 的递归执行与 MAKEFLAGS 变量 make 的递归调用是指:在 Makefile 中使用 make ...

  6. UBoot配置编译及Makefile分析

    一. UBoot配置编译初步分析 1. UBoot源码结构 (1)UBoot工程项目中的文件可以分为3类 ① 第1类目录:与处理器体系结构或开发板硬件直接相关 ② 第2类目录:一些通用的函数或驱动程序 ...

  7. 精尽Spring Boot源码分析 - @ConfigurationProperties 注解的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  8. makefile 分析 -- 内置变量及自动变量

    makefile 分析1  -p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则. -n 选项, 只运行,不执行, -d 选项,相当于--debug=a,  b(basic), ...

  9. Spring Boot 入门详细分析

    推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...

随机推荐

  1. Codeforces Round #396 (Div. 2) D

    Mahmoud wants to write a new dictionary that contains n words and relations between them. There are ...

  2. 18000 Two String 暴力。——— 读题

    http://acm.scau.edu.cn:8000/uoj/mainMenu.html 18000 Two String 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 ...

  3. Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础

    摘录自 冯乐乐的<Unity Shader入门精要> 笛卡尔坐标系 1)二维笛卡尔坐标系 在游戏制作中,我们使用的数学绝大部分都是计算位置.距离.角度等变量.而这些计算大部分都是在笛卡尔坐 ...

  4. 一个简易的Http请求转发器

    这两天一直再看微信开发,临时在我的电脑搭了个IIS服务器做微信开发,外网也能访问了,关键是,调试太麻烦了!! 我写完代码,要将代码发布到IIS才能接收微信消息,可是在这个过程中,我不知道微信发过来的是 ...

  5. AJPFX关于子类父类中的构造

    1.子父类中的构造函数不存在重写,因为子父类的构造函数名字不一样(重写要求子父类的方法名字一模一样,包括参数列表)2.子类创建对象时会先运行父类的构造函数再运行子类的构造函数.因为每个子类的构造函数的 ...

  6. 访问者模式和php实现

    访问者模式: 表示作用于某个对象结构中的各个元素的操作.它使你可以在不改变各个元素类的前提下定义作用于这些元素的操作. 角色: 1)抽象访问者:为该对象结构中具体元素角色声明一个访问操作接口.该操作接 ...

  7. 【原创】微信公众号与HTML 5混合模式揭秘4——jssdk调用微信扫一扫

    微信公众号与HTML 5混合模式揭秘1——如何部署JSSDK 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片 微信公众号与HTML 5混合模式揭秘3——JSSDK获取地理位置   在JS ...

  8. 打造自己的JavaScript武器库

    自己打造一把趁手的武器,高效率完成前端业务代码. 前言 作为战斗在业务一线的前端,要想少加班,就要想办法提高工作效率.这里提一个小点,我们在业务开发过程中,经常会重复用到日期格式化.url参数转对象. ...

  9. 《深入理解JavaScript闭包和原型》笔记

    By XFE-堪玉 以下知识来源于对王福朋所写<深入理解javascript原型和闭包>的理解和整理 一切都是对象[引用类型],对象都是通过函数创建的[Funcion类型] 对象是属性的集 ...

  10. LINUX一网卡多IP设置

    方法1:少量IP手动绑定(这里以绑定IP到eth0为例,其它网卡的话修改相应的文件名即可) 1.复制ifcfg-eth0的网卡配置文件并改名为ifcfg-eth0:0 [root@akinlau /] ...