DSP篇--C6701的COFF文件有效数据分析与提取
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文件有效数据分析与提取相关推荐
- DSP篇--C6701功能调试系列之 FLASH测试
目录 1. FLASH介绍 2. FLASH功能测试 调试的前期准备可以参考前面的博文:DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客 1. FLASH介绍 FL ...
- DSP篇--C6701 BOOT(头文件烧写法)
目录 1.简介 2.具体步骤 2.1编写应用程序工程 2.2生成头文件 2.2.1分析.dat和.h文件 2.2.2头文件生成器软件设计和开发 2.3加载flash烧写程序完成烧写过程 1.简介 这是 ...
- [网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)
本系列虽然叫"网络安全自学篇",但由于系统安全.软件安全与网络安全息息相关,作者同样会分享一些系统安全案例及基础工具用法,也是记录自己的成长史,希望大家喜欢,一起进步.前文 &qu ...
- 三大电机控制方案之DSP篇(1):TMS320F28335
三大电机控制方案之DSP篇(1):TMS320F28335 简介: TMS320F28335数字信号处理器是属于C2000系列的一款浮点DSP控制器.与以往的定点DSP相比,该器件的精度高,成本低, ...
- Java微信公众平台开发--番外篇,对GlobalConstants文件的补充
转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...
- (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现. 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileI ...
- 【OpenCV 例程 300篇】252.视频文件的读取与保存
『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]252. 视频文件的读取与保存 视频文件是由一系列图像组成的,视频的每一帧都是一幅图 ...
- 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文件 ...
- AutoSAR系列讲解(入门篇)5.3-ECUEX文件
AutoSAR系列讲解(入门篇)5.3-ECUEX文件 ECUEX文件 一.ECUEX简介 二.ECUEX内容涵盖等级 1.等级1:目前普遍状态 2.等级2:进阶状态 3.等级3:终极状态 ECUEX ...
- TI DSP处理器中的CMD 文件
原文转载于:http://blog.csdn.net/hj199404182515/article/details/52838869 非常感谢. 如果从事 TI DSP 处理器开发,CMD 文件一定 ...
最新文章
- python调用js库中的函数_Python 调用JS文件中的函数
- 用PHP实现var_export
- 通过源码分析Mybatis是如何返回数据库生成的自增主键值?
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
- java notify 指定_java的notify/notifyAll:如何notify指定的线程?
- java 十六进制转十进制_JAVA知识-分析JAVA中的重点和难点
- Downloader Middlewares
- elf 取路径_PatchELF 修改linux下elf文件library搜索路径
- python培训多久能入职_Python学到什么程度可以面试工作?
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- python异常数据处理_python中如何处理异常值
- android之camera2获取数据
- 【JAVA】Collections.sort()实现动态数组自定义排序
- java8的下载与安装(网上教程的安装方法)
- python的集成开发环境idle是有什么编写而成_Python 的集成开发环境IDLE是由( )编写而成。...
- Anker-一个研发工程师的电商梦
- javascript小案例-----tab栏切换
- xy苹果助手未受信任_【安全问题】关于苹果信任问题
- 提问的力量三:提问式思维----你是学习者还是评判者?
- 为什么计算机编程以英语为主,为什么做编程都用英文,中文不行吗?听程序员解释完,总算明白了...