Hexagon Binutils GNU 手册(13)

240 篇文章 11 订阅

3.2.3 Environment variables(环境变量)

可以使用以下环境变量控制链接器行为:

  • GNUTARGET
  • LDEMULATION
  • COLLECT_NO_DEMANGLE

如果不使用 -b 选项,GNUTARGET 将确定输入文件对象格式。 它的值应该是输入格式的 BFD 名称之一(第 3.5 节–后续)。 如果将 GNUTARGET 设置为默认值,BFD 会尝试通过检查二进制输入文件来发现输入格式。这种方法通常会成功,但它也会产生潜在的歧义,因为不存在确保用于指定目标文件格式的幻数唯一性的方法. 但是,每个系统上的 BFD 配置过程都会将该系统的常规格式放在搜索列表的首位,因此可以解决歧义以支持常规格式。

注意 
    如果未定义 GNUTARGET,则链接器使用目标的自然格式。

如果你不使用 -m 选项,LDEMULATION 将确定默认仿真。 仿真会影响链接器行为的各个方面,尤其是默认链接器脚本。 你可以使用 –verbose 或 -V 选项列出可用的仿真。 如果未使用 -m 选项且未定义 LDEMULATION 环境变量,则默认仿真取决于链接器的配置方式。

COLLECT_NO_DEMANGLE 导致链接器不对符号进行解码。 通常,链接器默认对符号进行解码。

注意 
GCC 链接器包装器以类似的方式使用 COLLECT_NO_DEMANGLE。  可以使用选项 --demangle 和 --no-demangle 覆盖默认设置。

3.3 Linker scripts(链接器脚本)

链接器由Linker scripts链接器脚本控制,该链接器脚本控制输入文件的链接方式。 该脚本以链接器命令语言编写,控制以下链接属性:

  • 输入文件中的部分如何映射到输出文件
  • 输出文件的文件格式和内存布局
  • 已创建段的运行时加载属性
  • 代码执行入口点
  • 共享库版本

链接器包含一个内置脚本,它用作将代码和数据分配到内存的默认链接器脚本。 用户不能修改默认脚本; 但是,它可以通过两种方式进行更改:

  • 它可以完全由用户定义的脚本文件替换。 在这种情况下,文件名在链接器命令行上指定为链接器选项 -T 的参数。
  • 可以通过将链接器命令上的用户定义脚本文件指定为普通链接器输入文件来扩充(而不是替换)它。

指定为普通链接器输入文件的脚本称为隐式脚本。 因为它们扩充了默认链接描述文件,所以隐式脚本通常只包含 symbol assignments(符号分配),或 INPUT、GROUP 或 VERSION命令(第 3.3.2 节)。

链接器可以确定输入文件是目标文件、存档文件还是隐式脚本文件。 如果链接器无法将输入文件识别为这些文件类型之一,则会生成错误。

注意 
    可以使用 --verbose 选项查看默认链接描述文件。
    某些选项(例如 -N 或 -r)会影响默认链接描述文件。

    默认链接描述文件根据 Hexagon 处理器内存布局的默认值分配内存段(第 3.4.2 节)。

    由隐式链接描述文件读取的任何输入文件都会在命令行中读取隐式链接描述文件本身的位置读取。  这会影响档案搜索。

3.3.1 脚本示例

链接器脚本可以简单也可以复杂,取决于程序的链接映射和内存布局。 出于解释链接描述文件的目的,此处提供的示例程序仅包含以下三个部分:

  • .text – 包含程序代码
  • .data – 包含程序数据
  • .bss – 包含未初始化的数据

程序代码应加载到内存地址 0x20000,程序数据从地址 0x4000000 开始。
鉴于上述信息,以下是该程序的完整链接描述文件:

SECTIONS
{
. = 0x20000;
.text : { *(.text) }
. = 0x4000000;
.data : { *(.data) }
.bss : { *(.bss) }
}

该脚本由一个 SECTIONS 命令(第 3.3.9 节)组成,该命令指定输入节如何映射到输出节,以及输出节如何放置在内存中。 SECTIONS 命令由一系列用大括号括起来的语句组成。

命令中的第一条语句将位置计数器符号 (.) 的值设置为代码起始地址 (0x20000)。 如果输出部分没有明确分配起始地址(第 3.3.9.11 节),则隐含地为其分配位置计数器的当前值。 位置计数器然后按输出部分的大小递增。 (位置计数器在 SECTIONS 命令开始时初始化为 0。)

第二条语句通过定义名为 .text 的输出段并将所有 .text 类型的输入段映射到其中来定义示例程序代码段。 表达式 *(.text) 指定所有链接器输入文件中的所有 .text 输入节。 输出段地址设置为当前位置计数器值 (0x20000)。

其余三个语句定义示例程序中的两个数据段(.data 和 .bss)。 .data 部分分配给地址 0x4000000,.bss 部分在 .data 部分结束后立即分配给内存。

为确保每个输出节具有所需的地址对齐,链接器可能会在节的开头自动增加位置计数器。 在上面的示例中,.text 和 .data 节的指定地址可能满足任何对齐约束,但链接器可能需要在 .data 节的末尾创建一个小的对齐间隙,以便正确对齐 . bss部分。

注意 
    链接描述文件支持本示例中未使用的许多功能。  有关详细信息,请参阅以下文档部分。

3.3.2 Script commands(脚本命令)

链接描述文件是包含一个或多个链接描述文件命令的文本文件。
命令具有以下格式:

  • 跟随一个或多个参数的可选关键字
  • symbol = expression形式的符号分配

脚本命令用分号隔开,一般忽略空格。 例如,以下脚本包含 PHDRS 和 SECTIONS 命令:

PHDRS
{
headers PT_PHDR PHDRS ;
interp PT_INTERP ;
text PT_LOAD FILEHDR PHDRS ;
data PT_LOAD ;
dynamic PT_DYNAMIC ;
} ;
SECTIONS
{
. = SIZEOF_HEADERS;
.interp : { *(.interp) } :text :interp
.text : { *(.text) } :text
.rodata : { *(.rodata) } /* defaults to :text */
...
. = . + 0x1000; /* move to new page in memory */
.data : { *(.data) } :data
.dynamic : { *(.dynamic) } :data :dynamic
...
}

主要的链接描述文件命令是 SECTIONS 和 MEMORY
SECTIONS 指定输入节如何映射到输出节,以及输出节如何放置在内存中。
MEMORY 描述了目标架构中的可用内存。 如果未在脚本中指定此命令,则链接器假定连续块中有足够的内存可用于所有输出。

注意
    每个链接描述文件都必须包含一个 SECTIONS 命令——每个脚本中都不需要出现其他脚本命令。
表 3-1 链接描述文件命令
命令描述
SECTIONS链接映射和段内存放置
MEMORY目标内存配置
ENTRY代码入口点
REGION_ALIAS为内存区域名称创建别名
symbol = expression; (=, +=, -=, *=, /=, <<=, >>=, *=,=)
PROVIDE如果引用但未定义,则定义符号
PROVIDE_HIDDEN定义隐藏的 PROVIDE 符号
EXTERN将符号指定为未定义
PHRDS段加载信息
VERSION共享库版本号
INPUT将文件指定为链接器输入文件
STARTUP将文件指定为first链接器输入文件
GROUP将文件指定为链接器归档文件
OUTPUT指定输出文件名
OUTPUT_FORMAT指定输出文件格式
OUTPUT_ARCH指定输出机器架构
TARGET指定输入文件格式
FORCE_COMMON_ALLOCATION为常用符号分配空间(即使对于可重定位的输出文件)
INHIBIT_COMMON_ALLOCATION禁止为常用符号分配空间(甚至是可重定位的输出文件)
AS_NEEDED仅在需要时添加共享库
INSERT在指定部分之前/之后插入先前的脚本命令
NOCROSSREFS如果指定部分之间存在任何交叉引用,则生成错误
ASSERT如果指定表达式的值为零,则以错误代码退出链接器。
INCLUDE包含链接描述文件
SEARCH_DIR将指定路径添加到搜索列表
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值