zoukankan      html  css  js  c++  java
  • uboot 版本号生成过程

    uboot 版本号生成过程

    uboot版本号貌似与实际开发不相关,但是我现在遇到一个bug与版本号关联密切。

    这个bug与《uboot dm9000驱动故障》基本上是一样的,但是在上一篇博文中我没有详细说明。

    bug发生现象:

    将svn仓库代码通过git-svn下载到本地,然后编译,生成的u-boot-nand.bin通过sd卡烧写到开发板,然后重启开发板,

    但是仅仅会重复显示如下信息:

    复制代码
    U-Boot 2011.06-00000-gccc7fce-svn222 (May 28 2014 - 09:55:33)Hwgw6410
    
    
    CPU:     S3C6400@533MHz
             Fclk = 533MHz, Hclk = 133MHz, Pclk = 66MHz (SYNC Mode) 
    Board: HWGW6410
    DRAM:  128 MiB
    复制代码

    之后如果在代码中任意一个源代码文件中添加一个空白字符并保存,然后编译,再通过sd卡烧写,重启开发板后

    就能够正常执行uboot所有功能。

    这两次生成的u-boot-nand.bin文件大小仅仅相差4个字节(分别为381708和381712个字节)

    而这两个版本生成的u-boot-nand.bin惟一的差别就是版本号字符串这个地方不一样,本地编辑文件后未上传到svn仓库时,

    其生成的uboot字符串前面这一部分内容如下:

    U-Boot 2011.06-00000-gccc7fce-dirty-svn222 

    仅仅是字符串中多了-dirty这几个字符。

    整个u-boot字符串生成过程如下。

    在Makefile中:

    复制代码
    $(VERSION_FILE):
            @( localvers='$(shell $(TOPDIR)/tools/setlocalversion $(TOPDIR))' ; 
               printf '#define PLAIN_VERSION "%s%s"
    ' 
                "$(U_BOOT_VERSION)" "$${localvers}" ; 
               printf '#define U_BOOT_VERSION "U-Boot %s%s"
    ' 
                "$(U_BOOT_VERSION)" "$${localvers}" ; 
            ) > $@.tmp
            @( printf '#define CC_VERSION_STRING "%s"
    ' 
             '$(shell $(CC) --version | head -n 1)' )>>  $@.tmp
            @( printf '#define LD_VERSION_STRING "%s"
    ' 
             '$(shell $(LD) -v | head -n 1)' )>>  $@.tmp
            @cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@
    复制代码

    Makefile中调用tools/setlocalversion生成localvers,然后根据将U_BOOT_VERSION和localvers串接起来生成PLAIN_VERSION和新的U_BOOT_BESION.

    tools/setlocalversion代码如下:

    复制代码
    #!/bin/sh
    # Print additional version information for non-release trees.
    
    usage() {
        echo "Usage: $0 [srctree]" >&2
        exit 1
    }
    
    cd "${1:-.}" || usage
    
    # Check for git and a git repo.
    if head=`git rev-parse --verify HEAD 2>/dev/null`; then
        # Do we have an untagged version?
        if git name-rev --tags HEAD | 
           grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then
                (git describe || git describe --tags || git describe --all --long) 
                    2>/dev/null | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
        fi
    
        # Are there uncommitted changes?
        git update-index --refresh --unmerged > /dev/null
        if git diff-index --name-only HEAD | grep -v "^scripts/package" 
            | read dummy; then
            printf '%s' -dirty
        fi
    
        # Is this git on svn?
        if git config --get svn-remote.svn.url >/dev/null; then
            printf -- '-svn%s' "`git svn find-rev $head`"
        fi
    fi
    
    # Check for svn and a svn repo.
    if rev=`svn info 2>/dev/null` ; then
        rev=`echo "${rev}" | grep '^Revision' | awk '{print $NF}'`
        printf -- '-svn%s' $rev
    fi
    
    # Check for any localversion-* files
    printf '%s' "`cat localversion-* 2>/dev/null`"
    复制代码

    在setlocalversion文件中根据svn和git的不同,生成不同的版本号字符串,详细过程可以自己分析。

    得到U_BOOT_VERSION后,在arch/arm/lib/board.c中有下面的代码:

    const char version_string[] =
         U_BOOT_VERSION" (" U_BOOT_DATE " - " U_BOOT_TIME ")"CONFIG_IDENT_STRING;

    该代码将U_BOOT_VERSION 以及日期时间以及CONFIG_IDENT_STRING都串接在一起就得到uboot版本号字符串。

    我的bug修改方式是将Makefile中PLAIN_VERSION和U_BOOT_VERSION中的localvers删除掉,然后将include/configs/*6410*.h中的

    CONFIG_IDENT_STRING字符串中添加一些内容,凑到以前能够成功的长度就可以了。

    这个修改方法是有点挫的,但是因为对整个uboot机制的不熟悉,只能用这个方法来作为权宜之计了。

  • 相关阅读:
    【流量劫持】SSLStrip 终极版 —— location 瞒天过海
    【流量劫持】沉默中的狂怒 —— Cookie 大喷发
    【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
    Web 前端攻防(2014版)
    流量劫持 —— 浮层登录框的隐患
    流量劫持能有多大危害?
    流量劫持是如何产生的?
    XSS 前端防火墙 —— 整装待发
    XSS 前端防火墙 —— 天衣无缝的防护
    XSS 前端防火墙 —— 无懈可击的钩子
  • 原文地址:https://www.cnblogs.com/Ph-one/p/9037715.html
Copyright © 2011-2022 走看看