u-boot-->makefile解析①

it2022-05-09  32

本文档是根据自己对makefile理解整理的笔记,文中如有错误,还请不吝留言指正,不胜感激!

基于u-boot 1.1.6版本,   文中所述‘顶层目录’为/u-boot-1.1.6/   

在u-boot 顶层目录下的Makefile中第240行起第一个目标:

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) all: $(ALL)U_BOOT_NAND 为空   obj为空,上面的语句展开为:all: u-boot.srec u-boot.bin System.map

  

Makefile中下面的三条语句

$(obj)u-boot.hex: $(obj)u-boot $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ $(obj)u-boot.srec: $(obj)u-boot $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ $(obj)u-boot.bin: $(obj)u-boot $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

 

#两个变量在顶层的config.mk中有定义:OBJCOPY = $(CROSS_COMPILE)objcopy #顶层Makefile中定义CROSS_COMPILE ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- endif #在include/config.mk中定义 ARCH = arm CPU = arm920t BOARD = 100ask24x0 SOC = s3c24x0 OBJCFLAGS += --gap-fill=0xff#--gap-fill = 0xff是objcopy的参数,表示在拷贝过程中,用0xff来填充段与段之间的空隙#objcopy 文件格式转换#例如:#arm-linux-objcopy -O <format> src_file des_file #  arm-linux-objcopy: arm平台格式转换 #  -O:创建一个输出文件#  format:指定输出文件格式为 ihex: HEX格式文件#                srec: S-record格式文件#                binary:BIN格式文件#  des_file:输出文件名#  src_file:源文件名#  $< :第一个依赖文件#  $@ :目标文件

根据上面变量的赋值,展开为:

u-boot.hex: u-boot arm-linux-objcopy --gap-fill=0xff -O ihex u-boot u-boot.hex u-boot.srec: u-boot arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec u-boot.bin: u-boot arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin

 Makefile中下面的语句

$(obj)u-boot.dis: $(obj)u-boot $(OBJDUMP) -d $< > $@ #OBJDUMP在顶层的config.mk中有定义:   OBJDUMP = $(CROSS_COMPILE)objdump #上面的语句展开为: u-boot.dis: u-boot arm-linux-objdump -d u-boot > u-boot.dis

下面摘出链接语句的部分来分析

cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \ --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \ -Map u-boot.map -o u-boot

#根据顶层Makefile中定义LNDIR := $(OBJTREE) OBJTREE := $(CURDIR)可知LNDIR即为当前目录 #顶层的config.mk中定义:   LD = $(CROSS_COMPILE)ld  LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS) #顶层Makefile中定义   LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds #在board/100ask24x0/config.mk中有:   TEXT_BASE = 0x33F80000 #顶层Makefile中定义   PLATFORM_LDFLAGS =

  LIBS = lib_generic/libgeneric.a  LIBS += board/$(BOARDDIR)/lib$(BOARD).a  LIBS += cpu/$(CPU)/lib$(CPU).a  ifdef SOC  LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a  endif  LIBS += lib_$(ARCH)/lib$(ARCH).a  LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \         fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a  LIBS += net/libnet.a  LIBS += disk/libdisk.a  LIBS += rtc/librtc.a  LIBS += dtt/libdtt.a  LIBS += drivers/libdrivers.a  LIBS += drivers/nand/libnand.a  LIBS += drivers/nand_legacy/libnand_legacy.a  LIBS += drivers/usb/libusb.a  LIBS += drivers/sk98lin/libsk98lin.a  LIBS += common/libcommon.a  LIBS += $(BOARDLIBS)

  cd . 

  arm-linux-ld -Bstatic -T/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 $$UNDEF_SYM cpu/arm920t/start.o --start-group  $(__LIBS) --end-group -Map u-boot.map -o u-boot

命令 静态链接 链接脚本 代码段链接地址 OBJ文件 lib文件 内存映射文件 目标

 

 

下面的两个目标暂时没完全读懂啥意思,先贴出来,多谢大神们留言解答

$(obj)u-boot.img: $(obj)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' $(VERSION_FILE) | \ sed -e 's/"[ ]*$$/ for $(BOARD) board"/') \ -d $< $@ $(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

 

转载于:https://www.cnblogs.com/liuxinyong236/p/9920748.html


最新回复(0)