DSP

DSP链接命令文件Linker.cmd的作用及用法举例

2019-07-13 18:57发布

以下是我自己在学习中的一些CMD文件的资料的收集和总结。 存储器空间 链接器在处理段的时候,有如下2个主要任务: 将由汇编器产生的COFF格式的一个或多个.obj文件链接成一个可执行的.out文件;重新定位,将输出的段分配到相应的存储器空间。 链接器有2条命令支持上述任务: (1) MEMORY命令。定义目标系统的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度; (2) SECTIONS命令。告诉链接器如何将输入段组合成输出段,以及将输出段放在存储器中的什么位置。 1. MEMORY命令         作用:定义系统中所包含的各种形式的存储器,以及它们占据的地址范围。         句法: MEMORY { PAGE0name 1[(attr)]:   orign=constant,  length=constant PAGElname n[attr]:             orign=constant,  length=constant } PAGE——对一个存储空间加以标记。PAGE 0程序存储器,PAGE l定为数据存储器。 Name——对一个存储区间取名。  Origin——存储区的起始地址。键入OriginOrgO都可 Length——规定存储区的长度。键入LengthLenL都可以 Attr——这是一个任选项,为命名区规定14个属性。 。  MEMORY命令的使用。 MEMORY { PAGE 0:         ROM:      origin=0c00h,        length=1000h PAGE 1:  SCRATCH: origin=60h,   length=20h                      ONCHIP:          origin=80h,   length=200h } 上述MEMORY命令所定义的系统的存储器配置如下: PAGE 0为程序存储器,名ROM,起始地址0C00H,长度4K字。 PAGE l为数据存储器,名SCRATCH,起始地址60H,长32字。  PAGEl为数据存储器,名ONCHIP,起始地址80H,长度512字。 2. SECTIONS命令 作用:说明如何将输入段组合成输出段;             规定输出段在存储器中的存放位置;             并允许重新命名输出段。 句法: SECTIONS { name:[propertypropertyproperty……] name:[propertypropertyproperty……] name:[propertypropertyproperty……] } Name——段名,每一个输出段的说明都从段名开始。 Property——性能参数,段名后面是一行说明段的内容和如何给                       段分配存储单元的性能参数。  一个段主要的性能参数有: 装入存储器分配(Load allocation)      定义段装入时的存储器地址,语法为           Load=allocation(这里allocation指地址)           或allocation           或>allocation (2) 运行存储器分配(Run allocation)        定义段运行时的存储器地址,语法为             Run=allocation             run>allocation       链接器为每个输出段在目标存储器中分配两个地址:一个是加载的地址,另一个是执行程序的地址。通常,这两个地址是相同的。有时要先将程序加载到ROM,然后在RAM中以较快的速度运行,只要用SECTIONS命令让链接器对这个段定位两次就行了。如.fir:    loadROMrun=RAM   SECTIONS命令的使用。 file1.obj     file2.obj SECTIONS {      .text:             load=ROM,   run=800h      .bss:               load=RAM      .vectors:          load=FF80h } .bss段结合file1.objfile2.obj.bss段且被装入RAM空间。 .text段结合file1.objfile2.obj.text段,链接器将所有命名为.text           的段都结合进该段,在程序运行时该段必须重新定位在地址           0800h .vectors段定位在地址FF80h 3. MEMORYSECTIONS命令的缺省算法         如果没有利用MEMORYSECTIONS命令,链接器就按缺省算法来定位输出段: MEMORY { PAGE 0PROGorigin=0x0080,    length=0xFF00 PAGE 1DATAorigin=0x0080,    length=0xFF80 } SECTIONS {      .text:        PAGE=0      .data:        PAGE=0      .cinit:        PAGE=0      .bss:         PAGE=1 块是目标文件中的最小单位。一个块就是最终在存储器映像中占据空间的一块代码或数据,目标文件中的每一个块都是相互独立的。一般的,COFF目标文件中包含三个默认的块: .text :通常包含可执行代码 .data :通常包含已初始化的数据 .bss :通常为未初始化的数据保留空间 所有的块分为两大类:已初始化块和未初始化块。对块的处理主要通过六个命令实现:.bss,.uset,.data,.sect,.asect,.text.其中.bss.usect用于建立未初始化块。 .bss建立的块名就是.bss .usect  “块名” 分配 .data.text建立的块名就是其本身。 后两个建立包含代码或者数据的块,用法类似于.data.text.只不过可以自己命名。 .sect “块名” .asect “块名”  地址 C编译器编译的目标程序还有以下块: 已初始化块: .cinit:包含初始化变量和常数表 .const:字符串和switch表, 未初始化块: .stack:为系统堆栈分配存储器,这个存储器用于将变量传递给函数以及分配局部变量。 .sysmem:为动态存储器函数分配存储器空间。