现在的位置: 首页 > 综合 > 正文

2. 分析uboot 的Makefile文件

2013年09月02日 ⁄ 综合 ⁄ 共 3699字 ⁄ 字号 评论关闭

一. 分析 uboot 的配置过程:

make 100ask24x0_config

查找:100ask24x0_config

100ask24x0_config    :    unconfig
    @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0

查找:MKCONFIG  

MKCONFIG    := $(SRCTREE)/mkconfig

相当于:

mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

打开:mkconfig

# mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
#  $0          $1      $2    $3      $4       $5    $6  

替换各个参数:

# 生成链接文件:
ln -s asm-$2 asm             # ln -s asm-arm asm
ln -s ${LNPREFIX}arch-$6 asm-$2/arch      #ln -s arch-s3c24x0 asm-arm/arch
ln -s ${LNPREFIX}proc-armv asm-$2/proc    #ln -s proc-armv asm-arm/proc

echo "ARCH   = $2" >  config.mk        #生成config.mk
echo "CPU    = $3" >> config.mk        #追加config.h
echo "BOARD  = $4" >> config.mk

相当于:

ARCH   = arm
CPU    = arm920t
BOARD  = 100ask24x0
SOC    = s3c24x0

生成 config.h 文件, 并写入下面内容

/* Automatically generated - do not edit */
#include <configs/100ask24x0.h>

二. 分析 uboot 编译过程:

make

查看makefile文件

一些obj

OBJS  = cpu/$(CPU)/start.o
# 相当于:
OBJS  = cpu/arm920t/start.o

一些lib

LIBS  = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
#相当于:
LIBS  = lib_generic/libgeneric.a
LIBS += board/100ask24x0/lib100ask24x0.a
LIBS += cpu/arm920t/libarm920t.a
......

找到 u-boot.bin 发现它依赖于u-boot

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


$(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可以得到如下信息:
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/s3c/workspace/system/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /home/s3c/workspace/system/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext
0x33F80000  $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/s3c/workspace/tools/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5
-lgcc \
                        -Map u-boot.map -o u-boot

从中还可以发现:

链接文件是 board/100ask24x0/u-boot.lds

uboot的地址 0x33F80000

1. 分析这个链接文件

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;

    . = ALIGN(4);
    .text      :
    {
      cpu/arm920t/start.o    (.text)
          board/100ask24x0/boot_init.o (.text)
      *(.text)
    }

    . = ALIGN(4);
    .rodata : { *(.rodata) }

    . = ALIGN(4);
    .data : { *(.data) }

    . = ALIGN(4);
    .got : { *(.got) }

    . = .;
    __u_boot_cmd_start = .;
    .u_boot_cmd : { *(.u_boot_cmd) }
    __u_boot_cmd_end = .;

    . = ALIGN(4);
    __bss_start = .;
    .bss : { *(.bss) }
    _end = .;
}

从这个链接文件里我们可以得到:

第一个运行的文件 cpu\arm920t\start.s

2. 查找一下这个址:

grep "33F80000" * -nR

board/100ask24x0/config.mk:25:TEXT_BASE = 0x33F80000
board/smdk2410/config.mk:25:TEXT_BASE = 0x33F80000
board/mpl/vcma9/config.mk:24:TEXT_BASE = 0x33F80000
board/sbc2410x/config.mk:23:TEXT_BASE = 0x33F80000
u-boot.srec:2:S31533F80000170000EA14F09FE514F09FE514F09FE526
u-boot.srec:12195:S31533FAF9F0E4F9FA33F8000000626F6F746172677371
u-boot.srec:12400:S70533F80000CF

发现这个地址其实是由board/100ask24x0/config.mk来定义的.

抱歉!评论已关闭.