u-boot分析之Makefile结构分析---编译

打开Makefile
117 include $(OBJTREE)/include/config.mk

包含我们之前配置阶段生成的config.mk文件

127 ifeq ($(ARCH),arm)
128 CROSS_COMPILE = arm-linux-
交叉编译工具链的选择
169 OBJS = cpu/$(CPU)/start.o
193 LIBS = lib_generic/libgeneric.a
194 LIBS += board/$(BOARDDIR)/lib$(BOARD).a
195 LIBS += cpu/$(CPU)/lib$(CPU).a
还有后面的所有libs
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)
我们可以理解为 把所有涉及的文件,编译好后打包生成一个库
239 ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
241 all: $(ALL)
我们执行make 命令时,就会执行这一行
依赖于 $(ALL)
我们的目的是想生成 u-boot.bin,我们看看它依赖于谁
249 $(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
此处进行了格式转换
u-boot 又依赖于谁
262 $(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
此时这部分相对比较复杂,我们可能一下看不懂,但是我们可以反向推理,我们从执行结果中的信息,与这个地方进行比较,就知道了
所以 执行 make 命令,在最后会有一段信息
make[1]: Leaving directory `/home/linux/s3c2440/u-boot-1.1.6/common'
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /home/linux/s3c2440/u-boot-1.1.6 &&
arm-linux-ld -Bstatic(这是在链接 ,链接的时候用到了哪些文件呢?) -T /home/linux/s3c2440/u-boot-1.1.6/board/100ask24x0/ u-boot.lds(链接脚本)
-Ttext 0x33F80000(代码段的基地址)
(以下都是原材料,那么这些材料的顺序都是怎么确定的呢?这就要看链接脚本了 u-boot.lds)
---------------------------------------------------
我们找到/home/linux/s3c2440/u-boot-1.1.6/board/100ask24x0/ u-boot.lds
SECTIONS
{
. = 0x00000000; # 当前地址等于0x00000000,加上 0x33F80000
#以后的代码段基地址就是 0x33F80000
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text) # 先放start.o 这个文件的代码段
board/100ask24x0/boot_init.o (.text) # 放boot_init.o 这个文件的代码段
*(.text) # 放其他文件的代码段
}
. = ALIGN(4);
.rodata : { *(.rodata) } # 放其他文件的只读数据段

. = ALIGN(4);
.data : { *(.data) }
等等
所以得出结论:
u-boot放在最前面的是
cpu/arm920t/start.o
board/100ask24x0/boot_init.o (.text)

所以u-boot运行的时候应该位于0x33F80000(如果想让u-boot开始时运行于别的地址,我们可以修改这个值)
我的SDRAM 是64M 0x30000000---0x34000000
如果我们的u-boot超过512k ,就要修改开始的位置了
先执行start.o
我们分析这个文件,就能知道整个u-boot的流程是什么样的
--------------------------------------------------
$UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a --end-group -L /home/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot (输出u-boot)
arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值