u-boot顶层Makefile分析
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即可查看到各个变量的具体值如下:
PLATFORM_RELFLAGS : -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float
PLATFORM_CPPFLAGS : -DCONFIG_ARM -D__ARM__ -march=armv5t
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
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
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
LDFLAGS : -Bstatic -T /home/yjg/arm6410/qudong/-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds -Ttext 0xCFE00000
CPP: /usr/local/arm/4.3./bin/arm-linux-gcc -E
MAKE: make
CROSS_COMPILE: /usr/local/arm/4.3./bin/arm-linux-
BOARDDIR : samsung/smdk6410
HOSTCC : gcc
HOSTCFLAGS : -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
ALL : u-boot.srec u-boot.bin System.map
SUBDIRS : tools examples post post/cpu
OBJS : cpu/s3c64xx/start.o
__OBJS : cpu/s3c64xx/start.o
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
__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
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
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 =
PATCHLEVEL =
SUBLEVEL =
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/-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds -Ttext 0xCFE00000
从其中可以发现cpu/s3c64xx/start.S是u-boot执行的第一个文件,后面就从这个函数入手分析u-boot的启动流程。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN();
.text :
{
cpu/s3c64xx/start.o (.text)
cpu/s3c64xx/s3c6410/cpu_init.o (.text)
cpu/s3c64xx/onenand_cp.o (.text)
cpu/s3c64xx/nand_cp.o (.text)
cpu/s3c64xx/movi.o (.text)
*(.text)
lib_arm/div0.o
}
. = ALIGN();
.rodata : { *(.rodata) }
. = ALIGN();
.data : { *(.data) }
. = ALIGN();
.got : { *(.got) }
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN();
.mmudata : { *(.mmudata) }
. = ALIGN();
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
u-boot顶层Makefile分析的更多相关文章
- TQ210 —— S5PV210 uboot顶层Makefile分析
转自:http://blog.csdn.net/wqx521/article/details/52469759 # (C) Copyright 2000-2008 # Wolfgang Denk, D ...
- uboot 顶层makefile细节分析
uboot的源文件众多,学习庞然大物首先找到脊椎--顶层的makfile,逐一破解.但是,uboot的makefile同样是一个庞然大物,所以也要找到它的主线.倘若过分专注部分细节,很难做到把握全局, ...
- uboot 主Makefile 分析。
本文以uboot_1.1.6 对应的CPU是S3C2440 为例 uboot_1.1.6 根目录下的主Makefile开头: VERSION = PATCHLEVEL = SUBLEVEL = EXT ...
- Android发展的一个重要方面Makefile分析
Android发展的一个重要方面Makefile分析 随着移动互联网的发展,移动开发也越来越吃香了.眼下最火的莫过于android.android是什么就不用说了,android自从开源以来,就受到非 ...
- 内核顶层Makefile相关4
http://www.groad.net/bbs/simple/?f104.html make 的递归执行与 MAKEFLAGS 变量 make 的递归调用是指:在 Makefile 中使用 make ...
- UBoot配置编译及Makefile分析
一. UBoot配置编译初步分析 1. UBoot源码结构 (1)UBoot工程项目中的文件可以分为3类 ① 第1类目录:与处理器体系结构或开发板硬件直接相关 ② 第2类目录:一些通用的函数或驱动程序 ...
- 精尽Spring Boot源码分析 - @ConfigurationProperties 注解的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- makefile 分析 -- 内置变量及自动变量
makefile 分析1 -p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则. -n 选项, 只运行,不执行, -d 选项,相当于--debug=a, b(basic), ...
- Spring Boot 入门详细分析
推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...
随机推荐
- Ubuntu下安装webstorm
需要下载 WebStorm和 JDK # tar xvf WebStorm-10.0.1.tar.gz # tar xvf jdk-8u20-linux-x64.tar.gz 配置 /etc/prof ...
- 修正 FreeBSD 字体锯齿问题
如果你给 FreeBSD 安装完图形界面,一登录就被满屏幕不论中英全是锯齿且残缺不堪入目的文字吓了一跳,那一定是安装了文泉驿字体.先不必急着卸载文泉驿,只需简单修改相关配置即可恢复正常显示.这是因为文 ...
- foreach循环与迭代器循环 删除插入元素的区别
(1)仅对其遍历而不修改容器大小时,只使用foreach循环 (2)需要边遍历边修改容器大小时(插入删除元素),只使用迭代器循环 import java.util.HashMap;import ja ...
- Django的模型与字段
Django的模型,包含字段field和操作方法,每个模型在数据库中映射为一张表. 基本原则: 每个model在django中是一个Python类 每个model都是django.db.models. ...
- 对象(Object)和类(Class)的关系?
对象属于某一类,即对象是某一个类的实例.例如: Public Class Flight Private _name As String Public Property Name As String G ...
- 关于nodejs模块安装后找不到包解决办法
主要原因是类似bower.gulp这些包后,没有添加到环境变量,但是有洁癖的我也不希望添加太多的软链接,所以在用phpstorm开始时有需要的情况下 定义临时的环境变量 http://stackove ...
- 简单的UDP程序
接受端: package com.dcz.udp; import java.io.IOException; import java.net.DatagramPacket; import java.ne ...
- 初识requestAnimationFrame
转载地址:https://blog.csdn.net/vhwfr2u02q/article/details/79492303 核心概念: 1.CPU节能:在页面不刷新时不执行回调(页面在隐藏.最小化等 ...
- JavaScript30-7 数组的一些基本方法
本次来学习数组的一些方法,之前学习的js数组的方法是在第四课里面(没有写到随笔里面) 之前第四课主要讲的是 filter() ,map() 这次课程主要介绍的是 some()`.`every()`.` ...
- Hibernate三种批量处理数据
概念:批量处理数据是指在一个事务场景中处理大量数据. 在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 execute ...