u-boot-1.1.6的配置编译过程分析 下载本文

内容发布更新时间 : 2024/6/26 9:56:53星期一 下面是文章的全部内容请认真阅读。

uboot更目录下的Makefile分析

一.配置过程(make smdk2410_config): smdk2410_config :

unconfig //相当于执行这条语句

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

------------------------------------------------------------------解析------------------------------------------------------------------------- MKCONFIG := $(SRCTREE)/mkconfig 最终替换mkconfig $(@:_config=) @表示目标,最终替换smdk2410

从而说明,执行make smdk2410_config命令,相当于执行以下命令:

mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0 ====================================================================================== $0 $1 $2 $3 $4 $5 $6 命令 cpu的架构 cpu类型,对应于cpu\\arm920t 开发板型号,board\\smdk2410 厂家 soc 注:

在linux的脚本文件里面,可以用$n来表示第n个参数,$0才是第一个参数,即为命令!!!!

====================================================================================== 对上一句命令进一步解析:

打开uboot更目录下面的mkconfig脚本文件,观看分析:

[ \ //如果有BOARD_NAME,就用这个的BOARD_NAME, //如果为空,则让BOARD_NAME = $1(即smdk2410)

cd ./include rm -f asm

ln -s asm-$2 asm //相当于ln -s asm-arm asm(建立一个连接文件asm,指向asm-arm)

问:为什么要建立这样的连接文件呢?

答:是为了在源码中写代码的方便,比如:

#include //源码中的书写形式!!!!

但是当执行完配置命令后,就相当于#include 。这样方便支持多种建构

rm -f asm-$2/arch //rm -f asm-arm/arch

ln -s ${LNPREFIX}arch-$6 asm-$2/arch //ln -s arch-s3c24x0 asm-arm/arch

//在asm-arm目录下建立一个连接文件arch,指向arch-s3c24x0 rm -f asm-$2/proc

ln -s ${LNPREFIX}proc-armv asm-$2/proc //ln -s proc-armv asm-arm/proc //在asm-arm目录下建立一个连接文件proc,指向proc-armv

************************************************************************************************* # Create include file for Make # 创建一个配置文件config.mk

echo \ = $2\ config.mk //>表示新建文件

echo \ = $3\ //>>表示在原有的文件中追加类容 echo \ = $4\

[ \

[ \ = $6\

**************************执行以上5句命令后,相当于config.mk中有类容**************************** ARCH = arm CPU = arm920t BOARD = $4smdk2410

SOC = s3c24x0 注意:

config.mk用于更目录的Makefile完成相关的配置筛选!!!

************************************************************************************************* # Create board specific header file #创建一个单板相关的头文件 > config.h # Create new config file fi

echo \

echo \

*************************执行以上4句命令后,相当于config.h中有类容****************************** Automatically generated - do not edit #include 注意:

config.h用于完成代码中相关配置的筛选!!!

*************************************************************************************************

二.编译过程(make)

再看Makefile.............................

# load ARCH, BOARD, and CPU configuration

include $(OBJTREE)/include/config.mk //包含上面配置过程生成的config.mk文件

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-linux- //如果ARCH = arm,则编译工具为arm-linux-

OBJS = cpu/$(CPU)/start.o //非常重要的命令!!!!!

//$(CPU) 即调用CPU = arm920t 即:OBJS = cpu/arm920t/start.o LIBS = lib_generic/libgeneric.a

LIBS += board/$(BOARDDIR)/lib$(BOARD).a //LIBS += board/smdk2410/libsmdk2410.a LIBS += cpu/$(CPU)/lib$(CPU).a //LIBS += cpu/arm920t/libarm920t.a

...

------------------------------------------------------------------------------------------------------------------------------------------------- 或者展开下列的定义:

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

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

-------------------------------------------------------------------------------------------------------------------------------------------------

或者直接make,然后观察编译信息:

cd /uboot_kernel/u-boot-1.1.6 &&

arm-linux-ld -Bstatic -T /uboot_kernel/u-boot-1.1.6/board/smdk2410/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o

\\--start-group lib_generic/libgeneric.a board/smdk2410/libsmdk2410.a cpu/arm920t/libarm920t.a cpu/

arm920t/s3c24x0/libs3c24x0.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/ sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L /usr/local/arm/3.4.1/ bin/../lib/gcc/arm-linux/3.4.1 -lgcc \\

-Map u-boot.map -o u-boot

------------------------------------------------------------------------------------------------------------------------------------------------- 注:从上面的连接过程得知。目标是依赖于连接脚本,start.o和许多lib库文件!! 问:那么多的连接时,依赖的原材料,让门谁放在最前面呢? 答:看连接脚本(board/smdk2410/u-boot.lds)便可以知道答案!!! 打开u-boot.lds,分析:

SECTIONS { . = 0x00000000; //当前地址等于0 //但是该地址会加上-Ttext 0x33F80000指出的0x33F80000,用于说明以后的东西会从0x33F80000这个地方开始排放!!!

//另外注意:-Ttext 0x33F80000中的0x33F8000是由board/smdk2410/config.mk中定义的!!这个的值可以根据自己开发板的内存的大小来做相应的调整!! . = ALIGN(4); //下面采用4字节对齐方式 }

.text : {

cpu/arm920t/start.o (.text) //最先放该文件的所有的代码段!! *(.text) //再放其他的所有文件的代码段 }

. = ALIGN(4);

.rodata : { *(.rodata) } //所有文件的只读数据段(由const定义) . = ALIGN(4);

.data : { *(.data) } //所有文件的数据段 . = ALIGN(4);

.got : { *(.got) } //

. = .; //当前地址

__u_boot_cmd_start = .; //__u_boot_cmd_start等于当前地址

.u_boot_cmd : { *(.u_boot_cmd) } //所有文件的.u_boot_cmd(由uboot自己定义的)段 __u_boot_cmd_end = .; . = ALIGN(4); __bss_start = .; .bss : { *(.bss) } _end = .;

------------------------------------------------------------------------------------ 综上得出结论:uboot被start.o来贯穿的!!!! 数据的排放是根据连接脚本u-boot.lds来排放的!!!!

共享以前分析uboot时做的笔记,包括: 1.u-boot-1.1.6的配置编译过程分析.doc 2.u-boot-2012.04.01的配置编译过程分析.doc 3.u-boot-1.1.6完全注释,基本实现了逐行的注释。 ...... // 后继更新的将直接上传群共享

请大家原谅哈,由于我们想建立一个uboot技术交流社区, 需要经费。故上述uboot笔记,需要9元钱购买,购买链接地址:

http://item.taobao.com/item.htm?spm=0.0.0.31.lHTZaH&id=17051965131

当然,为了让大家觉得花钱值得。大家购买后,可以凭借

该群由我(韦东山LINUX视频的答疑助手@万勇)和吴伟东(韦东

购买的帐号,加入“uboot移植交流群”。

山LINUX视频的答疑助手-小吴)负责,我们会在: 每周3晚上7点到10点和每周日(下午3点到6点和晚上8点到10 点)负责答疑。和大家一起学习uboot,实现逐行分析注释uboot。

我们建立该uboot技术交流群的宗旨是:

找些人在一起,为全天下的板子移植uboot!!!!

入群条件: 1.你是高手,可以无条件的入群。当然有考核的;

2.或者你是想学习的,购买“uboot完全注释”后,提供网名,入群