This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[FAQ] 【分享】TI目标文件格式的简述


本文汇集了TI代码生成工具使用的有关目标文件格式的基础知识。它还为两个紧密相关的主题提供了一些背景知识:十六进制hex文件和调试信息。

目标文件object file 包含要执行的代码的二进制表示形式。目标文件格式指定文件中信息的组织。

下面我们将依次介绍一下。

一 ELF:可执行和链接格式

ELF,代表Executable and Linking Format,即可执行文件和链接格式。一般来说,ELF是除C2000以外的每个TI工具集的默认(或唯一)目标文件格式。对于同时支持两种格式的编译器,使用--abi = eabi会将应用程序二进制接口(ABI)设置为EABI,其中包括ELF格式的使用。

ELF是否是行业标准?其实它背后没有标准机构,例如C和C ++标准背后的ANSI委员会。尽管如此,它比COFF更接近标准。在只有TI工具可以识别的ELF文件中编码信息非常容易,而其他工具则可能会忽略它们。因此,GNU实用程序readelf可用于检查TI生成的ELF文件。另外,TI工具可以读取Linux ELF文件。下面是一个使用armofd的示例,armofd是ARM工具集中的目标文件显示实用程序:

查找ELF规范的最佳方法是从TI文档开始。 ARM Optimizing C/C++ Compiler User's Guide的标题为“Application Binary Interface”。本部分包括指向EABI规范的链接。从那里,您可以找到ELF的最新规范。

附上链接: https://www.ti.com/lit/ug/spnu151v/spnu151v.pdf

 

二 COFF: Common Object File Format

TI工具集使用的第一个目标文件格式称为COFF,它表示通用目标文件格式,即Common Object File Format。 COFF最早出现在早期的Unix系统中。 COFF不是行业标准。 TI从Unix开始采用COFF,然后开始对其进行自定义。

对于同时支持两种格式的编译器, --abi = coffabi将应用程序二进制接口(ABI)设置为COFF ABI,其中包括使用COFF格式。

下面链接内的应用笔记是有关COFF的TI变型的最佳文档。请注意,该应用笔记中没有足够的信息来编写您自己的COFF处理代码。参见下一节。

文档链接: https://www.ti.com/lit/an/spraao8/spraao8.pdf

 

三 处理目标文件

若是客户想对TI目标文件进行某种处理。TI提供了“Object File Display”实用程序。ARM工具集实用程序名为armofd。其他工具集具有名称相似的实用程序。  Assembly Language Tools User's Guide中对此进行了记录。

如上例所示,使用默认选项可以获得大量信息。您可以使用-x获得XML格式的相同信息。您可以使用cg_xml包处理该XML数据 。

四 来自目标文件的hex文件

对象文件中信息的另一种表示形式是十六​​进制文件,即hex文件。用户通过使用工具集中的hex conversion utility来创建十六进制文件。ARM hex转换实用程序称为armhex。其他工具集具有名称相似的hex转换实用程序。输入是一个目标文件,而输出是一个十六进制文件。 

hex文件以多种方式使用。典型的用例是使用实用程序对闪存进行编程,该实用程序不接受目标文件作为输入,而是接受hex文件。

目标文件是二进制文件,而hex文件是ASCII文本文件。您可以使用自己喜欢的文本编辑器检查十六进制文件。有几种不同的十六进制文件格式。以下是使用Intel MCS-86格式的十六进制文件的开头。

五 比较文件大小:目标文件,hex文件,系统内存映像

一个目标文件所包含的远远超过了加载到系统内存中的二进制位。它包含其他信息,例如符号表,重定位条目和调试信息。因此,目标文件通常比系统内存中的相应映像占用更多的字节。hex文件也包含其他信息,例如地址和校验和以及间距。因此,虽然hex文件小于相应的目标文件,但它也大于系统内存中的映像。

六 调试信息格式

目标文件通常包含调试器(例如CCS)读取的信息,以执行诸如将地址与一行源代码相关联的操作。由于这种关系,用户会通常认为调试信息是目标文件格式的另一个细节。但其实不是这样的。调试信息的格式是单独指定的。最好将调试信息视为一个恰好被编码在目标文件中的独立概念。从理论上讲,目标文件可以包含以任何格式编码的调试信息。

在撰写本文时,TI编译器使用的默认调试格式是DWARF版本3。可以选择Dwarf版本2、3或4。以下是一些带有更多信息的链接: