編譯命令GEN_UBOOT
GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP)-x $(LIBBOARD) $(LIBS) | \
sed -n -e‘s/.*$(SYM_PREFIX)__u_boot_cmd_.*/-u\1/p’|sort|uniq`;\
cd$(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group$(__LIBS) --end-group $(PLATFORM_LIBS) \
-Mapu-boot.map -o u-boot
以上命令使用$(LDFLAGS)作為連接腳本,最終生成“u-boot”文件。
u-boot.bin文件生成過程
生成u-boot.bin文件的規(guī)則如下:
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY)${OBJCFLAGS} -O binary $《 $@
從U-Boot編譯輸出信息中可以知道上面的命令實(shí)質(zhì)上展開為:
arm-linux-objcopy--gap-fill=0xff -O binary u-boot u-boot.bin
編譯命令中的“-O binary”選項(xiàng)指定了輸出的文件為二進(jìn)制文件。而“--gap-fill=0xff”選項(xiàng)指定使用“0xff”填充段與段間的空閑區(qū)域。這條編譯命令實(shí)現(xiàn)了ELF格式的U-Boot文件到BIN格式的轉(zhuǎn)換。
System.map文件的生成
System.map是U-Boot的符號(hào)表,它包含了U-Boot的全局變量和函數(shù)的地址信息。將System.map生成的規(guī)則如下:
SYSTEM_MAP = \
$(NM)$1 | \
grep-v ‘compiled\|\.o$$\|[aUw]\|\。\.ng$$\|LASH[RL]DI’ | \
LC_ALL=Csort
$(obj)System.map: $(obj)u-boot
@$(callSYSTEM_MAP,$《) 》 $(obj)System.map
arm-linux-nm u-boot | grep -v‘compiled\|\.o$$\|[aUw]\|\。\.ng$$\|LASH[RL]DI’ | LC_ALL=Csort 》 System.map
也就是將arm-linux-nm命令查看u-boot的輸出信息經(jīng)過過濾和排序后輸出到System.map。為了了解System.map文件的作用,打開System.map:
33f80000 T _start
33f80020 t _undefined_instruction
33f80024 t _software_interrupt
33f80028 t _prefetch_abort
33f8002c t _data_abort
33f80030 t _not_used
33f80034 t _irq
33f80038 t _fiq
33f80040 t _TEXT_BASE
33f80044 T _armboot_start
33f80048 T _bss_start
33f8004c T _bss_end
… …
System.map表示的是地址標(biāo)號(hào)到該標(biāo)號(hào)表示的地址的一個(gè)映射關(guān)系。System.map每一行的格式都是“addr type name”,addr是標(biāo)號(hào)對(duì)應(yīng)的地址值,name是標(biāo)號(hào)名,type表示標(biāo)號(hào)的類型。
U-Boot的編譯和運(yùn)行并不一定要生成System.map,這個(gè)文件主要是提供給用戶或外部程序調(diào)試時(shí)使用的。
評(píng)論
查看更多