|
TI的编译器,连接器等工具产生的目标文件格式为Common Object File Format(简称COFF)。COFF格式是AT&T开发的,在UNIX系统中所采用的目标文件格式。TI的编译器产生的obj文件以及连接之后产生的out文件都是COFF格式的。用CCS载入out文件到DSP的内存的时候,CCS会分析这个out文件,将其中储存的代码段和初始数据等段中的数据复制到DSP的内存中,并且设置程序指针到Entry Point(入口地址)。Hex5x, Hex6x等转换工具通过分析out文件,将其输出为一个boot table,方便各种自举(自启动)程序的编写。例如我们经常把这样的boot table写入flash, 制作成能从flash自举的应用程序。
了解COFF文件的格式,有助于我们了解一些自启动的细节,明白CCS loader和hex转换工具的工作原理,或者编写一些特殊用途的启动程序。例如多启动或者部分更新正在运行的程序等等。
在TI的文档中有COFF文件格式的详细介绍。例如TMS320C55x Assembly Language Tools User’s Guide或者TMS320C6000 Assembly Language Tools User's Guide等。文档很详细,下面只是简单介绍一下COFF文件的基本构造。
COFF最开始是文件头和附加文件头,附加文件头中保存有Entry Point的地址。其后就是Section Header表,其中有各个section的物理地址、长度以及初始化数据的在文件中的偏移地址等信息。所有的section header结束之后就是数据区了。也就是需要复制到DSP 内存中去的数据。其后还有连接用的relocation信息,如果out文件的话不需要这些信息,relocation之后是符号表,例如C语言的全局变量,函数等符号都在这个表中储存。最后是字符串表,section的名称或者符号名称太长的时候就把这些名称字符串储存到字符串表中。 根据这样的结构,自己动手写一个out->boot table的程序其实也很简单,只需要从out文件中获取entry pointer、需要复制的各个section的地址、长度以及数据即可。
这里给出一个Python程序示范:COFF Reader ,它可以显示出out文件的结构。此程序只是一个示范,并无实用价值,参照它阅读COFF格式的文档也许会更加容易一些。运行此程序需要事先在电脑中安装Python 2.4。解压之后运行coff.py文件即可。左边是程序的界面截图.
|