注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

u-boot分析之配置、编译、连接过程  

2012-08-09 21:05:39|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、配置:make smdk2410_config

这个配置命令做了什么事情呢?
1、我们进入顶层Makefile文件,找到如下一句:
smdk2410_config :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

又有:
MKCONFIG := $(SRCTREE)/mkconfig,即源码树的mkconfig文件。
_config=‘’表示_config为空
所以配置命令的实际就是:
./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0

2、当然我们得去看看mkconfig文件了:
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" @BOARD_NAME=smdk2410 

echo "Configuring for ${BOARD_NAME} board..." @显示这条信息

因为:SRCTREE = OBJTREE
所以:
cd ./include
rm -f asm
ln -s asm-$2 asm
重新建立include/asm文件,并使其链接想asm-arm,这样的话我们在写头文件路径的时候,就直接写asm就可以了,不必再写asm-arm

rm -f asm-$2/arch
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
重新建立asm-arm/arch文件,使其链接向arch-s3c24x0

rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
重新建立asm-arm/proc文件,使其链接想proc-armv

echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk
创建include/config.mk文件,其内容添加为:
ARCH   = arm
CPU    = arm920t
BOARD  = smdk2410 
SOC    = s3c24x0

> config.h # Create new config file
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
创建config.h文件,并添加如下内容:
/* Automatically generated - do not edit */
#include <configs/smd2410.h>

总结一下就是配置命令做了三件事:
(1)BOARD_NAME=smdk2410
(2)建立链接文件,用于简化头文件路径
(3)建立了两个文件:config.mk、config.h
有config.h的内容我们知道,如果我们要新建一个单板的话,需要同时新建其对应的头文件,如smdk2410.h,我们可以仿造其他的单板头文件来修改!

二、编译和连接

OBJS  = cpu/$(CPU)/start.o
..............................................
LIBS  = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
定义一些变量OBJS  、LIBS ,他们指明哪些.o文件、.a文件会被编译进uboot

$(OBJS):
$(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

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

$(SUBDIRS):
$(MAKE) -C $@ all
这些命令用于生成这些.a、.o文件

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

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

这些代码就是将这些.a、.o文件连接成u-boot.bin文件,值得注意的是:
164:include $(TOPDIR)/config.mk
在顶层config.mk中有如下定义:
LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
BOARDDIR = $(BOARD)
BOARD  = smdk2410
board/smdk2410/config.mk中定义了TEXT_BASE=0x33f80000
总而言之:LDFLAGS = -Tu-boot-nand.lds -Ttext 0x33f80000
这就指定了文件和连接地址,我们至少要知道:
连接文件在:board/smdk2410/u-boot-nand.lds
连接地址定义在:board/smdk2410/config.mk

总结一下,顶层Makefile文件就定义了哪些文件将被编译进uboot,并进入其子目录,调用其子目录下的Makefile文件来编译文件,最终将编译出来的.a、.o文件连接起来
  评论这张
 
阅读(936)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018