查看: 7931|回复: 2

通用目标文件格式COFF

[复制链接]
  • TA的每日心情
    无聊
    2014-5-18 22:32
  • 签到天数: 257 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-12-26 09:30:58 | 显示全部楼层 |阅读模式
    分享到:

            TMS320系列DSP的目标文件各式为通用目标文件格式 COFF (Command Object File Format,简称COFF)。
    采用这种目标文件各式的优点是:将指令和数据按照段的概念进行组织和存储,这使得程序的可读性大大增强,更容易编写程序,更便于进行程序的移植,更利用进行模块化的程序设计,为管理代码段及系统存储器提供了灵活的方法和手段。段(sections)是COFF文件中最重要的概念,它是目标文件中的最小单元。所谓“段”就是通过汇编和连接后最终在TMS320存储器映象中占据连续空间的一块代码或数据。目标文件中的每一个段都是相互独立的。 COFF目标文件的段可以分为两大类:
    已初始化段:包含数据和代码。
    未初始化段:在存储印象中为未初始化数据保留空间。
      一般地,COFF目标文件包含3个默认(缺省)的段:
       text段、data段、bss段。如下所示为目标文件中的段与目标系统中存储器的关系。段的使用非常灵活,但常用以下约定:
    .text — 此段包含可执行程序代码。
    .data — 此段包含已初始化的数据。
    .bss  — 此段包含未初始化的变量。
    .sect  '名称' — 定义一个有名段,放初始化了的数据或程序代码。


    QQ截图20121226092938.png


    重定位:连接器的功能之一是把段重新定位到目标系统的存储映像中。


    1.未初始化段
             未初始化段主要用来在TMS320C28X存储器中保留空间,通常将它们定位到RAM中。这些段在目标文件中没有实际内容,只是保留空间而已。程序可以在运行时利用这些空间建立和存储变量。未初始化段是通过使用.bss和.usect汇编伪指令建立的,两条伪指令的句法分别为:
    •     .bss         symbol,字数
    •     symbol  .usect“段名”,字数

    2.已初始化段
    已初始化段包含可执行代码或已初始化数据。这些段的内容存储在目标文件中,加载程序时再放到TMS320C28X存储器中。三个用于建立初始化段的伪指令句法分别为:
    •      .text        [段起点]
    •      .data        [段起点]
    •      .sect        “段名”[,段起点]




    3.已命名段
    已命名段就是程序员自己定义的段,它与默认的.text、.data和.bss段一样使用,但与缺默认段分开汇编。 data段不同的存储器中,将未初始化的变量汇编到与.bss段不同的存储器中。产生命名段的伪指令为:
    •      symbol   .usect        “段名”,字数
    •     .sect        “段名”[,段起点]

    注:如果在程序中没有编写分段的任何指令,则汇编程序将把所有程序段和数据段都汇编至.text段中。


    4.子段
    子段(Subsections)是大段中的小段。链接器可以像处理段一样处理子段。子段的命名句法为:

    • 基段名:子段名

    例:用户用下列代码创建一个.text 段内的叫做——func 的字段

    .sect ".text:_func"
    子段也有两种,用.sect命令建立的是已初始化段,用.usect命令建立的是未初始化段。
    • symbol .usect "段名",字数
    •              .sect "段名"


    5.段程序计数器(SPC)
    汇编器为每个段安排一个独立的程序计数器,即段程序计数器(SPC)。SPC表示一个程序代码段或数据段内的当前地址。开始时,汇编器将每个SPC置0,当汇编器将程序代码或数据加到一个段内时,相应的SPC增加。如果汇编器再次遇到相同段名的段,继续汇编至相应的段,且相应的SPC在先前的基础上继续增加。

    链接器对段的处理有两个功能。首先,它将汇编器产生的COFF目标文件(.obj文件)中的各种段作为输入段,当有多个文件进行链接时,它将输入段组合起来,在可执行的COFF输出模块中建立各个输出段。其次,链接器为输出段选择存储器地址。

    链接器有两个伪指令完成上述功能,即:
    MEMORY 命令——定义目标系统的存储器配映像,包括对存储器各部分的命名,以及规定它们的起始地址和长度。
    SECTIONS命令——告诉链接器如何将输入段组合成输出段,以及在存储器何处存放输出段。子段可以用来更精确地编排段,可用链接器SECTIONS命令指定子段。



    QQ截图20121226093020.png

    重定位

    1.链接时重新定位
    • 将各个段定位到存储器中,每个段都从合适的地址开始。
    • 将符号值调整到相对于新的段地址的数值。
    • 调整对重新定位后符号的引用。
    2.运行时重新定位
    将代码装入存储器的一个地方,而运行在另一个地方。利用SECTIONS命令选项让链接器定位两次。
    链接器提供了一个简单的处理该问题的方法。利用SECTIONS命令选项让链接器定位两次。第一次使用装入关键字设置装入地址(load),再用运行关键字设置运行地址(run)。

    COFF文件中的符号
    外部符号指在一个模块中定义,在另一个模块中使用的符号。可使用.def、.ref或.global汇编伪指令将符号定义为外部符号。

    • .def在当前模块中定义,可以在别的模块中使用的符号;
    • .ref在当前模块中引用,但在别的模块中定义的符号;
    • .global可用于以上任何一种情况。

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-12-26 09:37:52 | 显示全部楼层
    飘过,帮顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-4-6 21:43:06 | 显示全部楼层
    有用。。。加深理解了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 00:52 , Processed in 0.146671 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.