C6701的COFF文件有效数据分析与提取,其难点在于对COFF文件结构的分析,需要参考相关的资料:

1、苗军,倪奇志.COFF文件分析提取器的实现及其应用[J].现代电子技术,2009,32(02):42-44+47.

2、TMS320C6000 Assembly Language Tools v6.0 Beta User's Guide中 A:common  object  file  format。

工作介绍:

①平台:VS2010,C语言编写。

②主要完成的功能任务为:将C6701程序生成的.out文件进行结构分析,分别提取其内部的有效数据段,再将之保存输出成.bin文件。

③功用:用于后续的flash烧录。

结构分析:其实参考资料1中讲述的很明白,在这里赘述一下吧:COFF文件开始是文件头22字节

//文件头----共222字节
typedef struct
{unsigned short MagicNumber;//魔法数,标识COFF文件的版本,平台标识   0-1unsigned short SectionCounter;//段头数目   2-3unsigned int TimeStamp;//时间戳生成时间    4-7unsigned int SymbolPointer;//符号表入口基地址,采用绝对地址  8-11 unsigned int Symbol;//符号表入口数目  12-15 unsigned short OptHdrSize;//可选文件长度。如果有值为28,否则为0   16-17unsigned short Flags;//文件标记  18-19unsigned short TargitID;//目标文件标记,若为a0x0099,目标文件能在C6x平台上运行 20-21
}FileHeader;

再就是可选文件头(0或28字节),继而是段头48字节,紧跟数据段,后续会有入口、字符串表等。

//可选文件头(若有,则占28字节)
typedef struct
{short MagicNumber;//魔法数,标识文件类型(0108h)   0-1short Version;//版本标识    2-3int TextSize;//代码段大小,byte   4-7int InitDataSize;//已初始化数据段大小,byte   8-11int UninitDataSize;//未初始化数据段大小,byte  12-15int Entry;//入口点  16-19int TextBase;//代码段(.text)基址  20-23int DataBase;//已初始化数据段基址    24-27
}OptinalHeader;//段头----48字节
typedef struct
{char Name[8];//段名,大于则为指向符号表的指针   0-7int PhyAddr;//段的物理地址  8-11int VirtAddr;//段的虚拟地址,目标运行地址  12-15int SecSize;//段长度,byte   16-19int SecPointer;//段数据指针  20-23int RelPointer;//段重定位表指针  24-27int LNOffset;//保留字段,行号表指针   28-31unsigned int RelSize;//重定位表长度  32-35unsigned int LNSize;//保留字段,行号表长度  36-39unsigned int Flags;//段标识   40-43unsigned short Reserved;//保留字段   44-45unsigned short MmPageNum;//内存页号  46-47
}SectionHeader;

我们需要根据前面信息,找到数据段中有效数据即可,因此仅列出前三部分的结构。

根据以上的结构分析,分别找到对应数据段的地址位置,数据长度即可将之写出:

int DramSize = 0x00000000 + 0x8000;
int PramSize = 0x00000000;
for(i = 1; i < fh.SectionCounter;i++)//直接排除第一个BRID段(主要是该段能够通过保留字的判据){//一个段头结构的检索fseek(fp_out,(fhByteNum+fh.OptHdrSize)+(i*48),SEEK_SET);//22+28fread(sh.Name,sizeof(char),8,fp_out);fread(&sh.PhyAddr,sizeof(int),1,fp_out);fseek(fp_out,4,SEEK_CUR);fread(&sh.SecSize,sizeof(int),1,fp_out);fread(&sh.SecPointer,sizeof(int),1,fp_out);fseek(fp_out,20,SEEK_CUR);fread(&sh.Reserved,sizeof(unsigned short),1,fp_out);fseek(fp_out,2,SEEK_CUR);if(sh.Reserved == 0x0000 && sh.SecPointer != 0)//对有效段的判据{if(abs(sh.PhyAddr) > 0xFFFF){fseek(fp_bin,DramSize,SEEK_SET);fseek(fp_out,sh.SecPointer,SEEK_SET);DramSize += sh.SecSize;for(j = 0;j < sh.SecSize;j++){short ch = fgetc(fp_out);fputc(ch,fp_bin);}}else{fseek(fp_bin,PramSize,SEEK_SET);//定位至写入文件的相应位置?fseek(fp_out,sh.SecPointer,SEEK_SET);//在文件流中检索开始写的字节位置PramSize += sh.SecSize;for(j = 0;j < sh.SecSize;j++){short ch = fgetc(fp_out);fputc(ch,fp_bin);}}//printf("%d \t %s \t 0x%0.8X\n",i,sh.Name,sh.PhyAddr);//输出有效段的ÌD、名称和起始物理地址}}

文件的读入和写出均是以二进制方式完成。

DSP篇--C6701的COFF文件有效数据分析与提取相关推荐

  1. DSP篇--C6701功能调试系列之 FLASH测试

    目录 1. FLASH介绍 2.  FLASH功能测试 调试的前期准备可以参考前面的博文:DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客 1. FLASH介绍 FL ...

  2. DSP篇--C6701 BOOT(头文件烧写法)

    目录 1.简介 2.具体步骤 2.1编写应用程序工程 2.2生成头文件 2.2.1分析.dat和.h文件 2.2.2头文件生成器软件设计和开发 2.3加载flash烧写程序完成烧写过程 1.简介 这是 ...

  3. [网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)

    本系列虽然叫"网络安全自学篇",但由于系统安全.软件安全与网络安全息息相关,作者同样会分享一些系统安全案例及基础工具用法,也是记录自己的成长史,希望大家喜欢,一起进步.前文 &qu ...

  4. 三大电机控制方案之DSP篇(1):TMS320F28335

    三大电机控制方案之DSP篇(1):TMS320F28335 简介: TMS320F28335数字信号处理器是属于C2000系列的一款浮点DSP控制器.与以往的定点DSP相比,该器件的精度高,成本低, ...

  5. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

    转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...

  6. (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现. 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileI ...

  7. 【OpenCV 例程 300篇】252.视频文件的读取与保存

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]252. 视频文件的读取与保存 视频文件是由一系列图像组成的,视频的每一帧都是一幅图 ...

  8. Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。

    ChatPDF的妙用 1.引言 2.代码实战 2.1 原理 2.2 安装 2.2 示例 2.2.1 创建PDF文件 2.2.2 旋转PDF文件 2.2.3 拆分PDF文件 2.2.4 合并PDF文件 ...

  9. AutoSAR系列讲解(入门篇)5.3-ECUEX文件

    AutoSAR系列讲解(入门篇)5.3-ECUEX文件 ECUEX文件 一.ECUEX简介 二.ECUEX内容涵盖等级 1.等级1:目前普遍状态 2.等级2:进阶状态 3.等级3:终极状态 ECUEX ...

  10. TI DSP处理器中的CMD 文件

    原文转载于:http://blog.csdn.net/hj199404182515/article/details/52838869  非常感谢. 如果从事 TI DSP 处理器开发,CMD 文件一定 ...

最新文章

  1. python调用js库中的函数_Python 调用JS文件中的函数
  2. 用PHP实现var_export
  3. 通过源码分析Mybatis是如何返回数据库生成的自增主键值?
  4. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
  5. java notify 指定_java的notify/notifyAll:如何notify指定的线程?
  6. java 十六进制转十进制_JAVA知识-分析JAVA中的重点和难点
  7. Downloader Middlewares
  8. elf 取路径_PatchELF 修改linux下elf文件library搜索路径
  9. python培训多久能入职_Python学到什么程度可以面试工作?
  10. Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
  11. python异常数据处理_python中如何处理异常值
  12. android之camera2获取数据
  13. 【JAVA】Collections.sort()实现动态数组自定义排序
  14. java8的下载与安装(网上教程的安装方法)
  15. python的集成开发环境idle是有什么编写而成_Python 的集成开发环境IDLE是由( )编写而成。...
  16. Anker-一个研发工程师的电商梦
  17. javascript小案例-----tab栏切换
  18. xy苹果助手未受信任_【安全问题】关于苹果信任问题
  19. 提问的力量三:提问式思维----你是学习者还是评判者?
  20. 为什么计算机编程以英语为主,为什么做编程都用英文,中文不行吗?听程序员解释完,总算明白了...

热门文章

  1. 项目管理的过程中如何做好沟通管理
  2. WordPress 速度优化的完整指南
  3. 2022年全球市场电动线性气缸总体规模、主要生产商、主要地区、产品和应用细分研究报告
  4. 3个国内最大的黑客学习网站
  5. python定义空数组_python定义二维数组
  6. 订阅号做微信登录php,Thinkphp5实现微信登录
  7. 年末展望:Oracle 对 JDK收费和.NET Core 给我们的机遇
  8. 如何擦除计算机连接网络的记录,如何清除上网记录 清除上网记录方法汇总
  9. Flutter小说APP
  10. Python每日一记129列表换行