工作点滴(四)Linux下合并二进制文件

0. 引言

在平时的Linux嵌入式开发中,我们常见的工作流程如下:

搭建交叉编译和开发环境--->模块开发--->build image--->release image

在最后一个阶段,即Image release阶段中,一般我们都是生成如下几个flash分区用的Image镜像文件,烧录进flash中对应的block中,如下图所示:

在开发阶段,不同的team或者开发人员就针对某一个block进行重复性的读写和调试,最后完成该模块的工

1. 问题产生

在Image releae的时候,或者要mass production的时候,就需要有一个完整的包含所有image的合并到一起的镜像文件一次性的烧录到board中,这时候就需要将所有的二进制镜像文件merge到一起了。

起初,这个工作是由硬件工程师将分块烧到flash的文件一次性通过硬件工具从flash中“吹”下来,然后拿着这个“吹”下来的文件再进行mass production的烧录工作。

有时候,没有这个条件的公司或者不方便“吹”flash时,就需要由软件工程师进行这个工作。

2. 解决问题

如图中所示,比如给kernel流出来1M的flash分区,这个分区一般实际生成的kernel image不会达到1M的大小。所以在合并文件时要在剩余的空间中用0xFF填充,这一点要特别注意。

2.1 方法一:

可以用Windows版本的二进制烧录工具,这个需要手工一个一个的添加上去,同时还要制定偏移量。可以在我提供的下载区域找到。

这种方法,稍嫌麻烦。虽然不是很慢。

2.2 方法二:

自己写程序,将这些镜像文件merged到一起。同时配合脚本,release的时候一起生成合并好的文件,毫无疑问,这种方法比较

3. 重点介绍自写程序(方法二)

附核心代码:

void append(FILE *dest, FILE *source,size_t total_len)

{

    size_t bytes;
    size_t wrote_len=0;

    static char temp[BUF_SIZE];

   /*write actural size of image*/
    while ((bytes = fread(temp, sizeof(char),BUF_SIZE, source))>0)

    {

        fwrite(temp, sizeof(char), bytes, dest);
        wrote_len += bytes;

    }

    /*filled with oxff when space left after write image in one block of flash*/
    if ( wrote_len <= total_len )
    {
        char *tmpPad=(char *)malloc(sizeof(char)*(total_len-wrote_len));
        memset(tmpPad,0x01,sizeof(tmpPad));        
        fwrite(tmpPad, sizeof(char), (total_len-wrote_len), dest);
    }



}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值