分类: LINUX
2007-07-20 02:31:50
除了源代码外,bootloader最重要的两个文件就是linker script(boot.lds)和Makefile,前者描述了各个object文件是如何链接的,包括输入段输出段的组织以及memory layout;后者描述了bootloader映像文件的生成线索。
Liod boot一共有3个Makefile,分别为./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.elf32的ELF格式的映像文件;(2)使用arm-linux-objcopy工具对目标文件boot.elf32进行处理和格式转换,生成一个名为boot的raw 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存储器运行。