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

下载本文档

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

文档简介

关于链接器的使用第一页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

链接器的运行

1.

运行链接程序

’C54x链接器的运行命令:

lnk500

[-options]filename1…filenamen

lnk500:

运行链接器命令。-options:

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

文件名。可以是目标文件、链接命令文件或文件库。所有文件扩展名的默认值为.obj。第二页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

运行链接程序

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

(1)键入命令:

lnk500

链接器会提示如下信息:

Commandfiles:Objectfiles[.obj]:

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

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

(要求键入一个链接器所生成的输出文件名)(要求附加一个链接选项)第三页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

运行链接程序

(2)

键入命令:

lnk500

file1.obj

file2.obj

-olink.out

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

目标文件:

file1.obj、file2.obj

命令选项:

-o

输出文件:

link.out

将两个目标文件进行链接,生成一个可执行的输出文件link.out。第四页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

运行链接程序

(3)

键入命令:

lnk500

linker.cmd

linker.cmd:链接命令文件。

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

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

file1.objfile2.obj-olink.out

第五页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

链接器的运行

2.

链接命令选项

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

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

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

第六页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具2.

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

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

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

-ar

生成一个可重新定位、可执行的目标模块。这里采用了

-a和-r两个选项(可以分开写成-a-r,也可以连在一起写作-ar),与-a选项相比,-ar选项还在输出文件中保留有重新定位信息。

-eglobal_symbol

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

第七页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具2.

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

对输出模块各段之间的空单元设置一个16位数值

(fill_value),如果不用-f选项,则这些空单元都置0。

-idir

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

-lfilename

命名一个文档库文件作为链接器的输入文件;filename

为文档库的某个文件名。此选项必须出现在-i选项之后。

-mfilename

生成一个.map映像文件,filename是映像文件的文件名。

.map文件中说明存储器配置、输入、输出段布局以及外部符号重定位之后的地址等。

-ofilename

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

-r

生成一个可重新定位的输出模块。当利用-r选项且不用

-a选项时,链接器生成一个不可执行的文件。

第八页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

链接器命令文件的编写与使用

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

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

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

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

第九页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

链接器命令文件的编写与使用

链接命令文件为ASCⅡ文件,可包含以下内容:

(1)

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

(2)

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

(3)

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

(4)

赋值说明,用于给全局符号定义和赋值。第十页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

例如:可根据给出链接命令,编写完成该命令操作的链接器命令文件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/*指定输出文件的选项*/第十一页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

【例】

链接器命令文件举例。

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}第十二页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具注意:在命令文件中,不能采用下列符号作为段名或符号名:

alignDSECTlenorunALIGNflengthorgRUNattrfillLENGTHoriginSECTIONSATTRFILLloadORIGINspareblockgroupLOADpagetypeBLOCKGROUPMEMORYPAGETYPECOPYl(小写L)NOLOADrangeUNION第十三页,共五十八页,2022年,8月28日第十四页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

目标库

目标库是用完全的目标文件作为成员的存档文件。通常是将一组有关的模块组合在一起而形成的库。

当指定目标库作为链接器的输入时,链接器将在库中搜索没有分辨的外部引用,并包括库中已定义有这些引用的任何成员。

使用目标库可减少链接的时间和可执行模块的长度。可利用存档器建立主要的库。

第十五页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

目标库假设:

输入文件f1.obj和f2.obj均引用了名为clrscr的外部函数;

输入文件f1.obj引用了符号origin;输入文件f2.obj引用了符号fillclr;

库libc.libc的成员Member0包含了origin的定义;

库libc.liba的成员Member3包含了fillclr的定义;

两个库的成员Member1都定义了clrscr。第十六页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

目标库若输入命令:

lnk500

f1.obj

liba.lib

f2.obj

libc.lib

则各引用的分辨如下:

库libc.liba的成员Member1满足对clrscr的引用②

库libc.libc的成员Member0满足对origin的引用

③库libc.liba的成员Member3满足对fillclr的引用

第十七页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

目标库若输入命令:

lnk500f1.objf2.objlibc.libliba.lib

则所有对clrscr的引用,都由库libc.libc的成员Member1满足。

第十八页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

目标库

当链接文件没有引用定义在库中的符号时,可使用-u选择项,强迫链接器包括库的成员。此时,输入命令:

lnk500-urout1libc.lib

则在链接器全局符号表中,产生一个没有定义的符号rout1。若库libc.lib的任何成员定义了rout1,则链接器将包括这些成员。

第十九页,共五十八页,2022年,8月28日第二十页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具4.5.4MEMORY指令

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

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

PAGEn:namen[(attr)]:origin=constant,length=constant;}指令字存储区间说明语句书写方式:①已大写MEMORY指令字开始;

②由大括号括起来的存储器区间说明。存储区间:存储页面区间名称区间属性起始地址区间长度第二十一页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

PAGE:

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

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

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

PAGE1用于数据存储器。

若没有规定PAGE,则链接器默认为PAGE0。第二十二页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

name:

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

等组成。

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

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

第二十三页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

attr:

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

定1~4个属性。

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

属性选项共有4项:

R

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

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

X

规定存储器可以装入可执行的程序代码。

I规定可以对存储器进行初始化。

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

第二十四页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

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

Length:

用来指定存储器空间的长度,可简写为len或l,其值以字为单位,可以用十进制、八进制或十六进制数表示。

第二十五页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

fill:

为任选项。用来为没有定位输出段的存储器空单元充填一个数,键入fill或f均可。该值是2个字节的整型常数,可以是十进制数、八进制数或十六制数。

第二十六页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具【例】用MEMORY伪指令编写连接命令文件。要求:

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

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

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

-oProg.out

MEMORY{

PAGE0:

ROM:origin=C00h,length=1000h

PAGE1:

SCR:

origin=60h,length=20h

CHIP:

origin=80h,length=200h}

两个输入文件链接命令选项指令字页面名称区间名称起始地址区间长度第二十七页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具【例】用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=200h00080h200h0027FhCHIP第二十八页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

SECTIONS指令

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

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

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

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

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

SECTIONS指令语法

第二十九页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具SECTIONS指令的句法:

SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}指令字输出段说明语句

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

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

SECTIONS指令语法属性属性属性第三十页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

SECTIONS指令语法

段属性用来定义输出段的内容和存储地址的分配。包括的内容如下:①

装入存储器分配

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

段的类型⑤充填值第三十一页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

SECTIONS指令语法①

装入存储器分配

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

或allocation

>allocation

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

第三十二页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

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的幂次)。

第三十三页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

SECTIONS指令语法①

装入存储器分配

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

例如:

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

第三十四页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

SECTIONS指令语法②

运行存储器分配

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

run>allocation

第三十五页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

SECTIONS指令语法

链接器为段在目标存储器中分配两个地址:

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

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

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

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

例如:

.fir:load=ROM,run=RAM

第三十六页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

SECTIONS指令语法③

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

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

例如:

SECTIONS{.text:.data:.bss

}链接时:在输入文件中的所有.text段链接成.text输出段所有.data段链接成.data输出段所有.bss段链接成.bss输出段第三十七页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

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段*/}}第三十八页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具1.

SECTIONS指令语法④

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

或type=DSECT

type=NOLOAD

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

name:…{…}=value

第三十九页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

SECTIONS指令2.

SECTIONS指令的使用

【例】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}两个输入文件链接命令选项指令字输出段说明语句第四十页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具2.

SECTIONS指令的使用

【例】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位边界第四十一页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具2.

SECTIONS指令的使用

【例】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位边界

ROM

RAM00h.text.con.bss.vec.dataFF80h运行时800h.text.text.text第四十二页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

SECTIONS指令3.

MEMORY和SECTIONS命令的默认使用

如果没有利用MEMORY和SECTIONS命令,链接器就按默认算法来定位输出段。

将所有的.text输入段链接成一个.text输出段,并配置到PAGE

0上的存储器;

将所有的.data输入段组合成.data输出段,定位到PAGE

0上的存储器;

第四十三页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具3.

MEMORY和SECTIONS命令的默认使用

所有的.bss输入段则组合成一个.bss输出段,并由链接器定位到配置为PAGE1上的存储器。

如果输入文件中包含有已初始化的命名段,则链接器将它们定位到程序存储器,紧随.data段之后。

如果输入文件中包括有未初始化的命名段,则链接器将它们定位到数据存储器,并紧随.bss段之后。

第四十四页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具3.

MEMORY和SECTIONS命令的默认使用

MEMORY{PAGE0:PROG:origin=0x0080,length=0xFF00PAGE1:DATA:origin=0x0080,length=0xFF80}SECTIONS{.text:PAGE=0.data:PAGE=0.cinit:PAGE=0.bss:PAGE=1}第四十五页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

多个文件的链接实例

下面以example.asm源程序为例,将复位向量列为一个单独的文件,对两个目标文件进行链接。(1)编写复位向量文件

vectors.asm文件清单:

.title“vectors.asm”.refstart.sect“.vectors”Bstart.end

第四十六页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具

多个文件的链接实例(2)

编写源程序文件清单:

.title“example.asm”.mmregsstack.usect“STACK”,10h;为堆栈指定空间

.bssa,4;为变量分配9个字的空间

.bssx,4.bssy,1.defstart.datatable:.word1,2,3,4;变量初始化

.word8,6,4,2.text第四十七页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具(2)

编写源程序

文件清单:

start:STM#

0,SWWSR;插入0个等待状态

STM#

STACK+10h,SP;设置堆栈指针

STM#

a,AR1;AR1指向aRPT#

7;移动8个数据

MVPDtable,*AR1+;从程序存储器到数据存储器

CALLSUM;调用SUM子程序

end:BendSUM:STM#

a,AR3;子程序执行

STM#

x,AR4RPTZA,#

3MAC*AR3+,*AR4+,ASTLA,@

yRET.end第四十八页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具(3)对源文件汇编(4)编写链接命令文件

编写的命令文件用来链接两个目标文件(输入文件),生成一个映像文件example.map和一个可执行的输出文件example.out。标号start是程序的入口。

假设目标存储器的配置如下:

程序存储器

EPROME000h~FFFFh(片外)

数据存储器

SPRAM0060h~007Fh(片内)DARAM0080h~017Fh(片内)

由汇编器分别对两个源文件进行汇编,生成目标文件example.obj和vectors.obj。

第四十九页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具(4)编写链接命令文件命令文件清单:

vectors.objexample.obj-oexample.out-mexample.map-estartMEMORY{PAGE0:EPROM:org=0E000h,len=100hVECS:org=0FF80h,len=04hPAGE1:SPRAM:org=0060h,len=20hDARAM:org=0080h,len=100h}第五十页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具(4)编写链接命令文件命令文件清单:

SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0.bss:>SPRAMPAGE1STACK:>DARAMPAGE1.vectors:>VECSPAGE0}第五十一页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具(4)编写链接命令文件

程序存储器配置了一个空间VECS,它的起始地址0ff80h,长度为04h,并将复位向量段.vectors放在VECS空间。

当’C54x复位后,首先进入0ff80h,再从0ff80h复位向量处跳转到主程序。

在命令文件中,有一条命令-estart,是软件仿真器的入口地址命令,目的是在软件仿真时,屏幕从start语句标号处显示程序清单,且PC也指向start位置(0e000h)。

第五十二页,共五十八页,2022年,8月28日第4章汇编语言程序开发工具(5)链接

经过链接器链接后,生成一个可执行的输出文件example.out和映像文件example.map。映像文件清单:

OUTPUTFILENAME:<example.out>ENTRYPOINTSYMBOL:“start”address:0000e000MEMORYCONFIGURATIONnameoriginlengthattributes

fill——————————————————PAGE

0:EPROM0000e000000000100RWIX

VECS0000FF80000000004RWIXPAGE

1:SPRAM00000060000000020RWIX

DARAM00000080000000100RWIX第五十三页,共五十八页,2022年,8月28

温馨提示

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

评论

0/150

提交评论