Chinaunix首页 | 论坛 | 博客
  • 博客访问: 841987
  • 博文数量: 85
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 952
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 22:52
文章分类

全部博文(85)

文章存档

2011年(1)

2008年(1)

2007年(60)

2006年(23)

我的朋友

分类: LINUX

2007-07-20 02:31:50

除了源代码外,bootloader最重要的两个文件就是linker script(boot.lds)Makefile,前者描述了各个object文件是如何链接的,包括输入段输出段的组织以及memory layout;后者描述了bootloader映像文件的生成线索。

Liod boot一共有3Makefile,分别为./Makefile./src/Makefile./utils/Makefile

./Makefile中设置了交叉编译的环境变量,并包含了config文件。

all : setup

make -C src

setup : utils/inetaddr config

perl -pi -e "s/(\.myipaddr =)[^\n]*/\$\1 `utils/inetaddr $(myipaddr)`,/" src/setup.c

perl -pi -e "s/(\.destipaddr =)[^\n]*/\$\1 `utils/inetaddr $(destipaddr)`,/" src/setup.c

perl -pi -e "s/(\.myhaddr =)[^\n]*/\$\1 `utils/macaddr`,/" src/setup.c

perl -pi -e "s/(\.sid =)[^\n]*/\$\1 `utils/setupid`,/" src/setup.c


config文件:

myipaddr=192.168.0.1

destipaddr=192.168.0.50


可见,最主要的工作就是对./src/Makefile进行make:

objfiles = start.o memsetup.o setup.o memcpy.o fixgpio.o partition.o

libgcc = $(shell $(CC) --print-libgcc-file-name)

binfile = boot


all : $(objfiles) boot.lds

echo "create $(binfile)"

$(CC) -static -nostdlib -T boot.lds -o $(binfile).elf32 $(objfiles) $(libgcc)

$(OBJCOPY) -O binary -R .bss -R .note -R .comment -S $(binfile).elf32 $(TOPDIR)/$(binfile)

可以发现,最重要的两件事是:(1)交叉编译各个源文件,并根据boot.lds这个linker script所定义的规则链接各个object files并生成名为boot.elf32ELF格式的映像文件;(2)使用arm-linux-objcopy工具对目标文件boot.elf32进行处理和格式转换,生成一个名为bootraw binary file,以下载到FLASH中运行。

objcopy工具可以在保持目标文件内容的情况下,对完全链接好的目标文件进行任意格式的转换。

这里使用'-O ibnary'选项是要生成一个raw binary file(plain format),这时会丢弃所有的符号和可重定位信息。这时objcopy实际上是从要拷贝的最低地址的段开始作一次memory dump'-S'选项用于删除包含调试信息的段,即—strip-all'-R sectionname' 用于删除不需要的段。

这与ADS中使用fromELF工具对ELF格式的映像文件进行格式转换或处理的操作很类似,例如我们使用fromELF工具把.axf映像文件转换为.bin的plain binary文件下载到FLASH存储器运行。

阅读(2091) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~