1. 基本概念
文件是计算机操作的基本单位,段则是连接器操作的基本单位。
输入段: 指的是来自文件中的输入段或者是库中的输入段。
输出段: 指的是在一个映像文件,包含一个或者多个段。输出段有三种属性:只读段(RO),可读写(RW)段和初始化为0(PI)段。
执行域:映像执行时各个段的地址。
加载域:映像文件中各个段所放置的地址。
RO,RW,ZI段的执行时与加载时的区别:映像文件在加载的时候,只有RO和RW属性的输出段,没有ZI属性的输出段。ZI属性的输出段是在程序初始化时生成的,但是ZI段的地址可以指定。
注意区别RW,ZI和堆栈的区别,RW,ZI是映像文件的东西,指的程序中初始化或者是未初始化的变量。堆栈是在程序运行中分配的空间,RW,ZI和堆栈是不同的概念,虽然在RAM中,但是需要分配不同的空间。
2. 语法:
执行域属性:
—PI:位置无关属性。
—OVERLAY:可以覆盖属性,默认选项。
—FIXDE:固定地址。加载地址和执行地址都是同一地址,必须是绝对地址或零偏移地址。
—UNINIT:未初始化的数据。
执行域描述举例:
EXEC_FIRST +0 0x2000 ;指定执行域名称,偏移地址,最长长度
{ ;执行域开始
中间是输入段描述;
} ;执行域结束
输入段描述:RO—CODE 也可以表达为CODE,只读代码段属性。
RO—DATA 也可以表达为CONST,只读数据段属性。
RO 也可以表达为TEXT,只读的代码段和只读的数据段。
RW—DATA 读写数据段属性。
RW—CODE 读写代码段属性。
RW 也可以表达为DATA,读写的代码段和读写的数据段。
ZI 也可以表达为BSS,初始化为0的数据段。
另外还有两个伪属性:FIRST和LAST,FIRST用于把一个输入段放在执行域的前面,LAST用于把一个输入段放在执行与的后面。
输入的描述分为模块描述和段描述,模块描述用来为链接器指定一个输入段的搜索范围。模块描述使用下列方法指定输入段的范围:使用包含输入段的目标文件的名称;使用包含输入段的库组件(不可以匹配路径)的名称;使用包含输入段的库文件的全名。
段描述分为两种:属性描述和段名描述。
属性描述:
段名描述:只能应用在汇编语言程序中,用括号括起来,前面不使用加号。
我们可以通过以下方式处理单个目标:
1) 把函数和数据放到其源文件。
2) 使用编译选项 –zo为每个函数单独生成一个目标文件。(参看ARM Compiler Guide),编译出来的目标文件可作为输入段。
3) 在C,C++源文件内利用 #pragma arm section 来生成多命名段。
4) 在汇编源文件内利用AREA 导向符来生成可重载段。
文章评论(0条评论)
登录后参与讨论