您的位置:首页 > 其它

u-boot编译过程分析

2017-08-27 20:06 316 查看
按照readme 所说的

make NAME_config

make

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

其中NAME_config在根目录的Makefile中,其中包含了很多

NAME_config,代表各个不同的板子。

如果要新添加一块板子的支持,需要在Makefile中新添加一个NAME_config

比如

#########################################################################

## HFRK S3C44B0 Systems

#########################################################################

hfrks3c44b0_config : unconfig

@./mkconfig
$(@:_config=) arm s3c44b0 hfrks3c44b0 hfrk

后面的几个参数依次表示 ARCH,CPU,BOARD,VENDOR

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

然后跟到mkconfig去看看执行了什么

根据该脚本的注释知道他做了三件事情

1)为变量赋值并输出到./include/config.mk文件的末尾(不要和根目录下面的config.mk搞混)

对于上面的配置项

ARCH
= arm

CPU
= s3c44b0

BOARD
= hfrks3c44b0

2)在./include下面建立了几个链接文件

rm
-f asm

ln
-s asm-$2 asm

rm
-f asm-$2/arch

ln
-s arch-$3 asm-$2/arch

if
[ "$2" = "arm" ] ; then

23ff7

rm
-f asm-$2/proc

ln
-s proc-armv asm-$2/proc

fi

也就是

asm/
--->asm-arm

arch-s3c44b0
--->asm-arm/arch

proc-armv
---> asm-arm/proc

3) 生产config.h文件

一般要编译一个软件,要有一个配置文件和一个makefile.u-BOOT底下,配置文件不是动态生成的。

而是手工编写的。文件中包含了很多CFG_xxx
CONFIG_xxxx这类的东西,这些在u-boot的README中

有详细的说明。

看此步骤的脚本:

#

#
Create board specific header file

#

if
[ "$APPEND" = "yes" ] #
Append to existing config file

then

echo
>> config.h

else

>
config.h #
Create new config file

fi

echo
"" >>config.h

echo
"#include <configs/$1.h>" >>config.h

exit
0

就是在./include中生成一个config.h文件,该文件中包含了实际的config文件

如上面的配置中:

config.h如下:

include
<configs/hfrks3c44b0.h>

所以hfrks3c44b0.h才是真正的配置文件,如果要添加一个新板子,要把该板子的

配置文件放入./include/configs/底下,名字就用NAME_config中的NAME。

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

下面看看根目录下面的config.mk

该文件也配置了一下常用的重要选项

包括

编译器如AS,LD,CC等

一些重要的FLAGS
如CFLAGS CPPFLAGS LDFLAGS.....

由*.s
*.c生成*.o的规则

#########################################

%.s: %.S

$(CPP)
$(AFLAGS) -o $@ $(CURDIR)/$<

%.o: %.S

$(CC)
$(AFLAGS) -c -o $@ $(CURDIR)/$<

%.o: %.c

$(CC)
$(CFLAGS) -c -o $@ $<

#############################################

还包含了几个文件

sinclude
$(TOPDIR)/$(ARCH)_config.mk PLATFORM_CPPFLAGS
+= -DCONFIG_ARM -D__ARM__

sinclude
$(TOPDIR)/cpu/$(CPU)/config.mk PLATFORM_CPPFLAGS,PLATFORM_RELFLAGS

sinclude
$(TOPDIR)/board/$(BOARDDIR)/config.mk TEXT_BASE
, PLATFORM_CPPFLAGS

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

接下来看跟目录下面的Makefile文件,这个是编译u-boot的核心

整个Makefile可以分成下面几个部分:

初始化变量

Include文件

确定要编译的OBJS和LIBS

编译规则(就是说如果编译出Image)

所有的配置项
NAME_config ......

clean规则

下面主要看看编译规则部分:

#########################################################################

ALL
= u-boot.srec u-boot.bin System.map

all: $(ALL)

u-boot.srec: u-boot

$(OBJCOPY)
${OBJCFLAGS} -O srec $< $@

u-boot.bin: u-boot

$(OBJCOPY)
${OBJCFLAGS} -O binary $< $@

u-boot.img: u-boot.bin

./tools/mkimage
-A $(ARCH) -T firmware -C none \

-a
$(TEXT_BASE) -e 0 \

-n
$(shell sed -n -e 's/.*U_BOOT_VERSION//p' include/version.h | \

sed
-e 's/"[ ]*$$/
for $(BOARD) board"/') \

-d
$< $@

u-boot.dis: u-boot

$(OBJDUMP)
-d $< > $@

u-boot: depend
$(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)

UNDEF_SYM=`$(OBJDUMP)
-x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\

$(LD)
$(LDFLAGS) $$UNDEF_SYM $(OBJS) \

--start-group
$(LIBS) $(PLATFORM_LIBS) --end-group \

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

$(LIBS):

$(MAKE)
-C `dirname $@`

$(SUBDIRS):

$(MAKE)
-C $@ all

gdbtools:

$(MAKE)
-C tools/gdb || exit 1

depend
dep:

@for
dir in $(SUBDIRS) ; do $(MAKE) -C $$dir .depend ; done

tags:

ctags
-w `find $(SUBDIRS) include \

lib_generic
board/$(BOARDDIR) cpu/$(CPU) lib_$(ARCH) \

fs/cramfs
fs/fat fs/fdos fs/jffs2 \

net
disk rtc dtt drivers drivers/sk98lin common \

\(
-name CVS -prune \) -o \( -name '*.[ch]' -print \)`

etags:

etags
-a `find $(SUBDIRS) include \

\(
-name CVS -prune \) -o \( -name '*.[ch]' -print \)`

System.map: u-boot

@$(NM)
$< | \

grep
-v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \

sort
> System.map

#########################################################################

如果用make
或者make all ,可以编译出 u-boot.srec u-boot.bin
System.map

其中 -
"u-boot.bin" is a raw binary image

-
"u-boot" is an image in ELF binary format

-
"u-boot.srec" is in Motorola S-Record format

u-boot.bin: u-boot

可以看出来u-boot.bin
的生成需要u-boot这个elf文件

从u-boot的生成过程可以看到,生成u-boot需要所有的OBJS和LIBS.

u-boot.img
是由u-boot自带的mkimage工具生成的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: