链接器的使用_第1页
链接器的使用_第2页
链接器的使用_第3页
链接器的使用_第4页
链接器的使用_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

链接器的使用2026/7/619:41DSP原理及应用2

链接器的使用链接器的主要任务是根据链接命令文件(.cmd),将一个或多个COFF目标文件链接起来,生成存储器映像文件(.map)和可执行的输出文件(.out)。

在链接过程中,链接器将各个目标文件合并,并完成以下工作:●

将各个段配置到目标系统的存储器。

对各个符号和段进行重新定位,并给它们指定一个最终的地址。

解决输入文件之间未定义的外部引用。2026/7/619:41DSP原理及应用31

链接器的运行

1.

运行链接程序

’C54x链接器的运行命令:

lnk500

[-options]filename1…filenamen

lnk500:

运行链接器命令。-options:

链接命令选项。可以出现在命令行或链接命令文件的任何位置。filenames:

文件名。可以是目标文件、链接命令文件或文件库。所有文件扩展名的默认值为.obj。2026/7/619:41DSP原理及应用41.

运行链接程序

’C54x链接器的运行,有三种方法:

(1)键入命令:

lnk500

链接器会提示如下信息:

Commandfiles:Objectfiles[.obj]:

OutputFiles[a.out]:Options:(要求键入一个或多个命令文件)

(要求键入一个或多个需要链接的目标文件)

(要求键入一个链接器所生成的输出文件名)(要求附加一个链接选项)2026/7/619:41DSP原理及应用51.

运行链接程序

(2)

键入命令:

lnk500

file1.obj

file2.obj

-olink.out

在命令行中指定选项和文件名。

目标文件:

file1.obj、file2.obj

命令选项:

-o

输出文件:

link.out

将两个目标文件进行链接,生成一个可执行的输出文件link.out。2026/7/619:41DSP原理及应用61.

运行链接程序

(3)

键入命令:

lnk500

linker.cmd

linker.cmd:链接命令文件。

在执行上述命令之前,需将链接的目标文件、链接命令选项以及存储器配置要求等编写到链接命令文件linker.cmd中。

例如:希望完成第二种命令的链接,在链接命令文件中,应包含如下内容:

file1.objfile2.obj-olink.out

2026/7/619:41DSP原理及应用71

链接器的运行

2.

链接命令选项在链接时,连接器通过链接命令选项控制链接操作。

链接命令选项可以放在命令行或命令文件中,所有选项前面必须加一短划线“-”。除-l和-i选项外,其他选项的先后顺序并不重要。

选项之间可以用空格分开。最常用选项为-m和-o,分别表示输出的地址分配表映像文件名和输出可执行文件名。

2026/7/619:41DSP原理及应用82.

链接命令选项链接命令选项选项含义-a

生成一个绝对地址的、可执行的输出模块。所建立的绝对地址输出文件中不包含重新定位信息。如果既不用-a

选项,也不用-r选项,链接器就像规定-a选项那样处理。

-ar

生成一个可重新定位、可执行的目标模块。这里采用了-a和-r两个选项(可以分开写成-a-r,也可以连在一起写作-ar),与-a选项相比,-ar选项还在输出文件中保留有重新定位信息。

-eglobal_symbol

定义一个全局符号,这个符号所对应的程序存储器地址,就是使用开发工具调试这个链接后的可执行文件时程序开始执行时的地址(称为入口地址)。当加载器将一个程序加载到目标存储器时,程序计数器(PC)被初始化到入口地址,然后从这个地址开始执行程序。

2026/7/619:41DSP原理及应用92.

链接命令选项链接命令选项选项含义-ffill_vale

对输出模块各段之间的空单元设置一个16位数值(fill_value),如果不用-f选项,则这些空单元都置0。

-idir

更改搜索文档库算法,先到dir(目录)中搜索。此选项必须出现在-l选项之前。

-lfilename

命名一个文档库文件作为链接器的输入文件;filename为文档库的某个文件名。此选项必须出现在-i选项之后。

-mfilename

生成一个.map映像文件,filename是映像文件的文件名。.map文件中说明存储器配置、输入、输出段布局以及外部符号重定位之后的地址等。

-ofilename

对可执行输出模块命名。如果默认,则此文件名为a.out。

-r

生成一个可重新定位的输出模块。当利用-r选项且不用-a选项时,链接器生成一个不可执行的文件。

2026/7/619:41DSP原理及应用102

链接器命令文件的编写与使用链接命令文件用来为链接器提供链接信息,可将链接操作所需的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。

在链接命令文件中,可使用MEMORY和SECTIONS伪指令,为实际应用指定存储器结构和地址的映射。

MEMORY——用来指定目标存储器结构。

SECTIONS——用来控制段的构成与地址分配。

2026/7/619:41DSP原理及应用112

链接器命令文件的编写与使用链接命令文件为ASCⅡ文件,可包含以下内容:

(1)

输入文件名,用来指定目标文件、存档库或其他命令文件。

(2)

链接器选项,它们在命令文件中的使用方法与在命令行中相同。

(3)

MEMORY和SECTIONS链接伪指令,用来指定目标存储器结构和地址分配。

(4)

赋值说明,用于给全局符号定义和赋值。2026/7/619:41DSP原理及应用12例如:可根据给出链接命令,编写完成该命令操作的链接器命令文件link.cmd。

lnk500a.objb.obj-mprog.map-oprog.out该命令是将两个目标文件a.obj和b.obj进行链接,生成一个映像文件prog.map和一个可执行的输出文件prog.out。链接命令文件的内容如下:

a.obj/*第一个输入文件名*/b.obj/*第二个输入文件名*/-mprog.map/*指定map文件的选项*/-oprog.out/*指定输出文件的选项*/2026/7/619:41DSP原理及应用13

【例1】链接器命令文件举例。

a.objb.obj/*输入文件名*/

-oprog.out/*指定输出文件的选项*/-mprog.map/*指定map文件的选项*/

MEMORY/*MEMORY伪指令*/

{PAGE0:ROM:origin=1000h,length=0100hPAGE1:RAM:origin=0100h,length=0100h}SECTIONS/*SECTIONS伪指令*/

{.text:>ROM.data:>ROM.bss:>RAM}

2026/7/619:41DSP原理及应用14注意:在命令文件中,不能采用下列符号作为段名或符号名:

alignDSECTlenorunALIGNflengthorgRUNattrfillLENGTHoriginSECTIONSATTRFILLloadORIGINspareblockgroupLOADpagetypeBLOCKGROUPMEMORYPAGETYPECOPYl(小写L)NOLOADrangeUNION2026/7/619:41DSP原理及应用154MEMORY指令

MEMORY指令用来规定目标存储器的结构。在实际的应用中,目标系统所配置的存储器是各不相同的,通过MEMORY指令,可以进行各种各样的存储器配置。MEMORY指令的句法:

MEMORY{PAGE0:name1[(attr)]:origin=constant,length=constant;PAGEn:namen[(attr)]:origin=constant,length=constant;}

指令字存储区间说明语句书写方式:①已大写MEMORY指令字开始;

②由大括号括起来的存储器区间说明。存储区间:存储页面区间名称区间属性起始地址区间长度2026/7/619:41DSP原理及应用164MEMORY指令存储区间说明语句:

PAGE:

指定存储器空间页面,最多为255页,取决于目标存储器的配置。

每一个PAGE代表一个完全独立的地址空间。

通常,PAGE0用于程序存储器;

PAGE1用于数据存储器。

若没有规定PAGE,则链接器默认为PAGE0。2026/7/619:41DSP原理及应用174MEMORY指令存储区间说明语句:

name:

存储器区间名称。可由用字母、$、.、_等组成。

存储器区间为内部记号,因此不需要保留在输出文件或者符号表中。

不同PAGE上的存储器区间可以取相同的名字,但在同一PAGE内的名字不能相同,且不许重叠配置。

2026/7/619:41DSP原理及应用184MEMORY指令存储区间说明语句:

attr:

为任选项,用来为命名的存储器区间规

定1~4个属性。

当对输出段定位时,可利用属性限制输出段分配到一定的存储区间。

属性选项共有4项:

R

规定可以对存储器执行读操作。

W规定可以对存储器执行写操作。

X

规定存储器可以装入可执行的程序代码。I规定可以对存储器进行初始化。

若未选属性,可将输出段不受限制地定位到任何一个存储器的位置。任何一个没有规定属性的存储器(包括所有默认方式的存储器)都有全部4项属性。

2026/7/619:41DSP原理及应用194MEMORY指令存储区间说明语句:

origin:用来指定存储区间的起始地址,可简写为org或o。其值以字为单位,可以用十进制、八进制或十六进制数表示。

Length:

用来指定存储器空间的长度,可简写为len或l,其值以字为单位,可以用十进制、八进制或十六进制数表示。2026/7/619:41DSP原理及应用204MEMORY指令存储区间说明语句:

fill:

为任选项。用来为没有定位输出段的存储器空单元充填一个数,键入fill或f均可。该值是2个字节的整型常数,可以是十进制数、八进制数或十六制数。2026/7/619:41DSP原理及应用21【例2】用MEMORY伪指令编写连接命令文件。要求:

程序存储器:4K字ROM,起始地址为C00h,取名为ROM。

数据存储器:32字RAM,起始地址为60h,取名为SCR。

512字RAM,起始地址为80h,取名为CHIP。file1.objfiel2.obj-oProg.outMEMORY{

PAGE0:

ROM:origin=C00h,length=1000h

PAGE1:

SCR:origin=60h,length=20h

CHIP:origin=80h,length=200h}

两个输入文件链接命令选项指令字页面名称区间名称起始地址区间长度2026/7/619:41DSP原理及应用22【例2】用MEMORY伪指令编写连接命令文件。file1.objfiel2.obj-oProg.outMEMORY{ PAGE0:

ROM:org=C00h,len=1000hPAGE1:

SCR:org=60h,len=20h

CHIP:org=80h,len=200h}

PAGE0:ROM:org=C00h,len=1000h程序存储器00000h0FFFFh00C00h1000h01C00hROMPAGE1:

SCR:org=60h,len=20h数据存储器00000h0FFFFh00060h0007Fh20hSCR

CHIP:org=80h,len=200h00080h200h0027FhCHIP2026/7/619:41DSP原理及应用235

SECTIONS指令用来控制段的构成与地址分配。指令功能:

①说明如何将输入段组合成输出段;

在可执行程序中定义输出段;③

规定输出段在存储器中的存放位置;④

允许重新命名输出段。1.

SECTIONS指令语法

2026/7/619:41DSP原理及应用24SECTIONS指令的句法:

SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}

指令字输出段说明语句

段名:定义输出段的名称。

属性:定义该段的内容和存储器的分配。段名1.

SECTIONS指令语法属性属性属性2026/7/619:41DSP原理及应用251.

SECTIONS指令语法段属性用来定义输出段的内容和存储地址的分配。包括的内容如下:①装入存储器分配

②运行存储器分配③输入段④

段的类型⑤充填值2026/7/619:41DSP原理及应用261.

SECTIONS指令语法①装入存储器分配

用于定义段装入时的存储器地址。语法格式:load=allocation

或allocation

或>allocation

allocation:关于段地址的说明,即给段分配存储单元。

2026/7/619:41DSP原理及应用271.

SECTIONS指令语法①装入存储器分配例如:

.text:load=0x1000

.text:load>ROM.bss:load>(RW).text:align=0x80.text:PAGE0.bss:load=block(0x80)

将.text段定位到一个特定的地址。

将.text段定位到命名为ROM的存储区。

将.bss段定位到属性为R、W的存储区。

将.text段定位到从地址0x80开始。

将.text段定位到PAGE0。

将.bss段定位到一个n字存储器块

的任何一个位置(n为2的幂次)。

2026/7/619:41DSP原理及应用281.

SECTIONS指令语法①装入存储器分配

若用到一个以上参数,可以将它们排成一行。

例如:

.text:>ROM(align(16)PAGE(2))

2026/7/619:41DSP原理及应用291.

SECTIONS指令语法②运行存储器分配

用于定义段运行时的存储器地址。语法格式:run=allocation

run>allocation

2026/7/619:41DSP原理及应用301.

SECTIONS指令语法链接器为段在目标存储器中分配两个地址:

加载的地址——由装入存储器分配完成

执行程序的地址——由运行存储器分配完成

通常,这两个地址是相同的。

若要想把程序的加载区分开,先将程序加载到ROM,然后在RAM中运行,则用SECTIONS命令让链接器对这个段定位两次即可。

例如:

.fir:load=ROM,run=RAM

2026/7/619:41DSP原理及应用311.

SECTIONS指令语法③输入段用于定义组成输出段的输入段。语法格式:{input_sections}

大多数情况下,在SECTIONS命令中是不列出每个输入文件的输入段的段名。

例如:

SECTIONS{.text:.data:.bss

}链接时:在输入文件中的所有.text段链接成.text输出段所有.data段链接成.data输出段所有.bss段链接成.bss输出段2026/7/619:41DSP原理及应用321.

SECTIONS指令语法用文件名和段名来规定输入段。

SECTIONS{.text:/*创建.text输出段*/{

f1.obj(.text)/*链接来自f1.obj文件中的.text段*/

f2.obj(sec1)/*链接来自f2.obj文件中的sec1段*/

f3.obj/*链接来自f3.obj文件中的所有段*/

f4.obj(.text,sec2)/*链接f4.obj文件中的.text段和sec2段*/}}2026/7/619:41DSP原理及应用331.

SECTIONS指令语法④

段的类型用于为输出段定义特殊形式的标记。语法格式:type=COPY

或type=DSECT

type=NOLOAD

⑤充填值用于对未初始化空单元定义一个数值。语法格式:fill=value

name:…{…}=value

2026/7/619:41DSP原理及应用345

SECTIONS指令2.

SECTIONS指令的使用

【例3】SECTIONS指令的使用。

file1.objfile2.obj-oProg.outSECTIONS{.text:load=ROM,run=800h.con:load=ROM.bss:load=RAM.vec:load=FF80h{t1.obj(.int1)t2.obj(.int2)endvec=.;}.data:align=16}两个输入文件链接命令选项指令字输出段说明语句2026/7/619:41DSP原理及应用352.

SECTIONS指令的使用

【例3】SECTIONS指令的使用。

file1.objfile2.obj-oProg.outSECTIONS{.text:load=ROM,run=800h.con:load=ROM.bss:load=RAM.vec:load=FF80h{t1.obj(.int1)t2.obj(.int2)endvec=.;}.data:align=16}输出段加载地址运行地址.textROMRAM800h.conROM.bssRAM.vecROMFF80.dataRAM16位边界2026/7/619:41DSP原理及应用362.

SECTIONS指令的使用

【例3】SECTIONS指令的使用。

file1.objfile2.obj-oProg.outSECTIONS{.text:load=ROM,run=800h.con:load=ROM.bss:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论