理论教育 公共目标文件格式COFF介绍及应用说明

公共目标文件格式COFF介绍及应用说明

时间:2023-06-15 理论教育 版权反馈
【摘要】:编译、汇编与链接程序建立的目标文件采用共用目标文件格式,便于模块化编程、管理代码段和存储器,即不必为程序代码或变量指定目标地址,这为程序编写、移植和升级提供了很大方便。汇编器根据命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。图4-5给出了一个包含.text、.data和.bss段的目标文件,也表示出了目标文件中段与目标存储器之间的关系。

公共目标文件格式COFF介绍及应用说明

编译、汇编与链接程序建立的目标文件采用共用目标文件格式(Common Object File Format,COFF),便于模块化编程、管理代码段和存储器,即不必为程序代码或变量指定目标地址,这为程序编写、移植和升级提供了很大方便。

汇编器根据命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器分配存储单元,即把各个段重新定位到目标存储器中。

段(section,也称为块)是目标文件的最小单位,是在存储器中占据连续空间的代码和数据块,各段相互独立。

汇编器的COFF文件格式包括三个默认的段:

.text段,即程序段,也称文本段,该段通常包含可执行代码即程序。

.data段,即数据段,该段通常包含已初始化的数据。

.bss段,即保留数据空间段,该段通常为未初始化的数据保留空间。

图4-5给出了一个包含.text、.data和.bss段的目标文件,也表示出了目标文件中段与目标存储器之间的关系。

汇编器和链接器允许用户建立和链接自定义的段。所有段可以分为初始化段和未初始化段两类。初始化段包含程序代码和数据。未初始化段则为未初始化的数据保留存储空间。汇编命令.sect和.usect可以分别用来创建自定义的初始化段和未初始化段。

C编译器对C程序编译后也产生初始化段和未初始化段,具体的段名稍有不同,除了不使用.data段之外,还产生一些新的段。C28x的C/C++编译器产生的两类基本段的链接分别见表4-5和表4-6。

978-7-111-57271-8-Chapter04-9.jpg

图4-5 目标文件中段与目标存储器之间的关系

4-5 初始化段链接

978-7-111-57271-8-Chapter04-10.jpg

C28x编译器将存储器处理为程序存储器和数据存储器。程序存储器包含可执行代码、初始化数据和开关表;数据存储器则主要包含外部变量、静态变量和系统堆栈。链接器确定存储器地址映射。

4-6 未初始化段链接

978-7-111-57271-8-Chapter04-11.jpg

C编译器的任务是产生可重定位的代码,允许链接器将代码和数据定位到合适的存储空间。编译器对C语言编译后除了生成两个基本段,即.text、.bss外,还生成.cinit、.pint、.const、.econst、.switch、.ebss.、.stack、.sysmem.和.esysmem段。这些段也可分为初始化段和未初始化段。(www.daowen.com)

初始化段包含可执行代码或常数表。C编译器产生的初始化段有.pint、.const、.econst、.text、.cinit和.switch。

.text段,包含可执行代码和常量(constant)。

.cinit段和.pint段,包含初始化变量和常量。

.const段,包含串常量,全局变量、静态变量的声明和初始化。

.econst段,包含串常量,全局变量、静态变量的声明和初始化。变量由far const修饰,或用大存储器模型,初始化后放进远(far)存储器。

.switch段,包含switch语句表。

未初始化段用于保留存储器(通常为RAM)空间。C编译器产生的为初始化段有.bss、.ebss、.stack、.sysmem和.esysmem。

.bss段,为全局和静态变量保留空间。

.ebss段,为全局和静态变量保留空间。变量由far修饰,或用大存储器模型使用。

.stack段,为C系统堆栈。用于保护函数的返回地址、分配局部变量、调用函数时传递参数。

.sysmem段,为动态存储器分配保留空间,malloc函数使用。

.esysmem段,为动态存储器分配保留空间,far malloc函数使用。

各种段在程序中的映射见表4-7。链接器从不同的模块取出每个段并将这些段用同一个名称联合起来产生输出段。全部的程序就是由这些输出段组成的。可以根据需要将这些输出段放置到地址空间的任何位置,以满足系统的要求。.text、.cinit和.switch段通常链接到ROM或RAM中,且必须链接到程序存储器(Page0)中。.const、.econst段可以链接到ROM或RAM中,但必须链接到数据存储空间(Page1)中。.bss、.ebss、.stack和.sysmem/.esysmem段必须链接到RAM中,且必须在数据存储器(Page1)中。

4-7 存储器映射表

978-7-111-57271-8-Chapter04-12.jpg

(续)

978-7-111-57271-8-Chapter04-13.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈