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

    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    Leetcode Plus One
    Leetcode Swap Nodes in Pairs
    Leetcode Remove Nth Node From End of List
    leetcode Remove Duplicates from Sorted Array
    leetcode Remove Element
    leetcode Container With Most Water
    leetcode String to Integer (atoi)
    leetcode Palindrome Number
    leetcode Roman to Integer
    leetcode ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/Rainingday/p/7699797.html
Copyright © 2011-2022 走看看