首页 理论教育 链接器如何处理程序段?

链接器如何处理程序段?

时间:2023-06-20 理论教育 版权反馈
【摘要】:若未使用伪指令,则链接器将使用目标处理器默认的方法将段放入存储空间。默认的方式下,链接器将从存储器的0080h开始,对组合后的各段进行存储器配置。3.链接命令文件链接器通过链接命令文件来控制对段的处理,命令文件为ASCⅡ文件,可包含以下内容:①控制链接的输入文件名、指定目标文件、存档库或其他命令。功能示例 需要完成链接任务,编写该命令操作的链接器命令文件link.cmd。若没有规定PAGE,则链接器默认为PAGE0。

链接器如何处理程序段?

链接器是开发TMS320C54x器件必不可少的开发工具之一,它对段处理时有两个主要任务:一个是将一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后在一个执行的COFF输出模块中建立各个输出段;另一个是在程序装入时对其重新定位,为各个输出段选定存储器地址。有2条伪指令支持上述任务:

MEMORY伪指令:用来定义目标系统的存储器配置空间,包括对存储器各部分命名,以及规定它们的起始地址和长度

SECTIONS伪指令:用来指定链接器将输入段组合成输出段方式,以及输出段在存储器中的位置,也可用于指定子段。

若未使用伪指令,则链接器将使用目标处理器默认的方法将段放入存储空间。

1.默认的存储器分配

链接器可对多个目标文件进行链接。若链接文件中不使用MEMORY和SECTIONS命令,则为默认方式。每个目标文件都有.text段、.data段、.bss段和命名段。若采用默认链接,链接器将对多个目标文件中的各个段进行组合,形成各自的对应段,并将各个段配置到所指定的存储器中,形成可执行的目标模块,如图5-4所示。默认的方式下,链接器将从存储器的0080h开始,对组合后的各段进行存储器配置。默认的存储器分配:

978-7-111-35536-6-Chapter05-38.jpg

图5-4 链接器将多个输入段组合成一个可执行的目标模块

1)将所有.text段组合在一起,形成一个.text段,并分配到程序存储器中。

2)将多个目标文件中的.data段组合在一起,分配到紧接着.text段的程序存储空间中。

3)将.bss段组合,配置到数据存储器中。

4)组合命名段。初始化的命名段按顺序分配到紧随.data段的程序存储器,而未初始化命名段将被配置到紧随.bss段的数据存储器中。

2.段放入存储器空间

若不希望链接器将所有的.text段结合在一起形成单个的.text段,就不能采用默认的方式。由于DSP硬件系统中可能配置多种类型的存储器,若要把某一段分配到特定类型的存储器中,或将命名段配置特定的地址,则需采用MEMORY和SECTIONS伪指令来配置。若不采用默认的方式,通常需要建立一个链接命令文件,在命令文件中用MEMORY和SECTIONS伪指令定义存储器和配置段地址。

3.链接命令文件

链接器通过链接命令文件来控制对段的处理,命令文件为ASCⅡ文件,可包含以下内容:

①控制链接的输入文件名、指定目标文件、存档库或其他命令。

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

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

(1)功能示例

例5-16】 需要完成链接任务(lnk500 a.obj b.obj -m prog.map -o prog.out),编写该命令操作的链接器命令文件link.cmd。

该命令功能是将两个目标文件a.obj和b.obj进行链接,生成一个映射文件prog.map和一个可执行的输出文件prog.out。

链接命令文件的内容如下:

978-7-111-35536-6-Chapter05-39.jpg

MEMORY和SECTIONS伪指令控制生成代码存放的存储空间。

(2)MEMORY用法

MEMORY用于指定系统硬件存在的物理存储器所占用的空间,指令的句法:

978-7-111-35536-6-Chapter05-40.jpg

说明以大写MEMORY指令字开始,并由一对大括号括起来的存储器区间说明。系统存储空间说明的格式如下:

存储区间:存储页面区间名称区间属性起始地址区间长度

其中:

①PAGE:指定存储器空间页面,最多为255页,取决于目标存储器的配置。每一个PAGE代表一个完全独立的地址空间。通常,PAGE0用于程序存储器;PAGE1用于数据存储器。若没有规定PAGE,则链接器默认为PAGE0。

②name:存储器区间名称。可由字母、$、_等组成。存储器区间为内部记号,因此不需要保留在输出文件或者符号表中。不同PAGE上的存储器区间可以取相同的名字,但在同一PAGE内的名字不能相同,且不许重叠配置。

③attr:为任选项,用来为命名的存储器区间规定1~4个属性。当对输出段定位时,可利用属性限制输出段分配到一定的存储区间。属性选项共有4项:

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

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

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

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

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

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

例如在链接命令文件link.cmd(见例5-16)中的代码段:

978-7-111-35536-6-Chapter05-41.jpg

表示系统存在两块可用的物理存储空间:

程序存储器:256字ROM,起始地址为1000h,取名为ROM。

数据存储器:256字RAM,起始地址为0100h,取名为RAM。

(3)SECTIONS用法

SECTIONS用来控制段的构成与地址分配,主要是指明把程序编译的各种段分别存放到物理存储空间的什么位置。它在功能上描述了如何将输入段组合成输出段;在可执行程序中定义输出段;规定输出段在存储器中的存放位置;允许重新命名输出段。

978-7-111-35536-6-Chapter05-42.jpg

说明以大写SECTIONS指令字开始,并由一对大括号括起来的输出段说明语句说明。输出段说明语句的格式如下:

段名属性属性属性

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

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

例如在链接命令文件link.cmd(见例5-16)中的代码段:

978-7-111-35536-6-Chapter05-43.jpg

输出段说明语句包含三条说明:第一条.text:>ROM中,.text是段名,>ROM是属性,指明链接后生成的段.text被存放到MEMORY指定的物理存储器ROM空间中。其余两条类似。

属性用来定义输出段的内容和存储地址的分配,可以指定以下内容:

●装入存储器分配。

●运行存储器分配。

●输入段。

●段的类型。

●充填值。

1)装入存储器分配,用于定义段装入时的存储器地址。

978-7-111-35536-6-Chapter05-44.jpg

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

例5-17】 定义段装入时的存储器地址示例。

978-7-111-35536-6-Chapter05-45.jpg

2)运行存储器分配,用于定义段运行时的存储器地址。

978-7-111-35536-6-Chapter05-46.jpg

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

加载的地址,是由装入存储器分配完成。

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

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

例5-18】 定义段运行时的存储器地址。

978-7-111-35536-6-Chapter05-47.jpg

3)输入段,用于定义组成输出段的输入段,用文件名和段名来规定输入段。语法格式:{input_sections}

例5-19】 段的多文件组合示例。

978-7-111-35536-6-Chapter05-48.jpg

(4)MEMORY和SECTIONS命令的默认使用

如果没有明确使用MEMORY和SECTIONS命令,链接器就按默认处理。默认处理会把所有的.text输入段链接成一个.text输出段,并配置到PAGE0上的存储器;将所有的.data输入段组合成.data输出段,定位到PAGE0上的存储器;将所有的.bss输入段组合成一个.bss输出段,配置到PAGE1上的存储器。若包含已初始化的命名段,则配置到程序存储器,紧随.data段之后。若包括未初始化的命名段,则配置到数据存储器,紧随.bss段之后。

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

我要反馈