zoukankan      html  css  js  c++  java
  • uboot学习——基于S3C2440的u-boot-1.1.6分析(一)

    编译u-bbot-1.1.6分为两步——1.配置;2.编译。关于配置可参考u-boot分析mkconfig

    (1)从Makefile开始,分析Makfile开始的部分可以得出几个重要的目录设定

    (2)包含include/config.mk,把配置时的几个参数包含到Makfile,并制定交叉编译前缀。

    ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk))
    
    # load ARCH, BOARD, and CPU configuration
    include $(OBJTREE)/include/config.mk
    export    ARCH CPU BOARD VENDOR SOC
    
    ifndef CROSS_COMPILE
    ...
    ifeq ($(ARCH),arm)
    CROSS_COMPILE = arm-linux-
    endif
    ...
    #endif

    export    CROSS_COMPIL

    (3)包含顶层目录下的config.mk,这个文件里面主要定义了交叉编译器及选项和编译规则。

    # load other configuration
    include $(TOPDIR)/config.mk
    #比如 一下为config.mk部分内容
    ...
    # clean the slate ...
    PLATFORM_RELFLAGS = #在arm920t文件夹下的config.mk文件夹下有追加,后边有包含这个文件
    PLATFORM_CPPFLAGS =
    PLATFORM_LDFLAGS =
    ...
    #
    # Include the make variables (CC, etc...)
    #
    AS    = $(CROSS_COMPILE)as
    LD    = $(CROSS_COMPILE)ld
    CC    = $(CROSS_COMPILE)gcc
    CPP    = $(CC) -E
    AR    = $(CROSS_COMPILE)ar
    NM    = $(CROSS_COMPILE)nm
    STRIP    = $(CROSS_COMPILE)strip
    OBJCOPY = $(CROSS_COMPILE)objcopy
    OBJDUMP = $(CROSS_COMPILE)objdump
    RANLIB    = $(CROSS_COMPILE)RANLIB
    ...
    LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
    ...
    LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
    ...

    (4)包含u-boot所必须的目标文件

    OBJS  = cpu/$(CPU)/start.o# 顺序很重要,start.o必须放第一位 
    OBJS := $(addprefix $(obj),$(OBJS))

    (5)包含所需的库文件

    LIBS  = lib_generic/libgeneric.a              
    LIBS += board/$(BOARDDIR)/lib$(BOARD).a    # board/100ask24x0/lib100ask24x0.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)
    
    LIBS := $(addprefix $(obj),$(LIBS))
    .PHONY : $(LIBS)

    根据上面的include/config.mk文件定义的ARCH、CPU、BOARD、SOC这些变量。硬件平台依赖的目录文件可以根据这些定义来确定。

    (8)最终生成的各种镜像文件:

    ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
    
    all:        $(ALL)
    
    $(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 $< $@
    
    $(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.dis:    $(obj)u-boot
            $(OBJDUMP) -d $< > $@
    
    $(obj)u-boot:        depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
            UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*(__u_boot_cmd_.*)/-u1/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_.*)/-u1/p'|sort|uniq`; //换行
            cd /home/work/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /home/work/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 /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t -lgcc -lc -L/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib 
                -Map u-boot.map -o u-boot

    分析u-boot.lds

    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    一个涉及到浮点寄存器的CM
    树和二叉树一篇就搞定!
    串的两种模式匹配方式(BF/KMP算法)
    队列的知识讲解与基本实现(数据结构)
    如何用C++实现栈
    判断List集合为空还是null的正确打开方式
    双链表的基本实现与讲解(C++描述)
    Redis从认识安装到实现增删改查
    如何使用C++实现单链表
    线性表——顺序表的实现与讲解(C++描述)
  • 原文地址:https://www.cnblogs.com/Rainingday/p/7699797.html
Copyright © 2011-2022 走看看