JavaScript is required to for searching.
跳过导航链接
退出打印视图
链接程序和库指南     Oracle Solaris 10 1/13 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分使用链接编辑器和运行时链接程序

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

第 2 部分快速参考

5.  链接编辑器快速参考

第 3 部分高级主题

6.  直接绑定

7.  生成目标文件以优化系统性能

8.  mapfile

9.  接口和版本控制

10.  使用动态字符串标记建立依赖性

11.  可扩展性机制

第 4 部分ELF 应用程序二进制接口

12.  目标文件格式

13.  程序装入和动态链接

14.  线程局部存储

第 5 部分附录

A.  链接程序和库的更新及新增功能

B.  System V 发行版 4(版本 1)mapfile

mapfile 结构和语法

段声明

映射指令

段内节的排序

大小符号声明

文件控制指令

映射示例

mapfile 选项缺省值

内部映射结构

索引

mapfile 结构和语法

您可以在 mapfile 中输入以下基本类型的指令:

每个指令可以跨越多行,并且可以包含任意数量的空格(包括换行符),但空格后面要跟随一个分号。

通常,段声明后面跟有映射指令。您可以声明段,然后定义节成为该段的一部分所依据的标准。如果在未首先声明要映射到的段(内置段除外)的情况下输入映射指令或大小符号声明,则会为该段赋予缺省属性。此类段为隐式声明的段。

大小符号声明和文件控制指令可以出现在 mapfile 中的任何位置。

以下各节将针对每种指令类型进行介绍。对于所有语法讨论,以下表示法都适用。

段声明

段声明可在输出文件中创建新段,或更改现有段的属性值。现有段可以是您先前定义的段,也可以是下面即将介绍的四个内置段之一。

段声明的语法如下:

        segment_name = {segment_attribute_value}*;

对于每个 segment_name,可以按任意顺序指定任何数量的 segment_attribute_values,但每个值都要由空格进行分隔。每个段属性只能有一个属性值。下表列出了段属性及其有效值。

表 B-1 mapfile 段属性

属性
segment_type
LOAD | NOTE | NULL | STACK
segment_flags
? [E] [N] [O] [R] [W] [X]
virtual_address
Vnumber
physical_address
Pnumber
length
Lnumber
rounding
Rnumber
alignment
Anumber

有四个内置段,其缺省属性值如下所示:

缺省情况下,禁用 bss 段。任何类型为 SHT_NOBITS(此类型为节的唯一输入)的节都是在 data 段中捕获的。有关 SHT_NOBITS 节的完整说明,请参见表 12-5。最简单的 bss 声明足以创建 bss 段。

        bss =;

任何 SHT_NOBITS 节都是由此段(而不是 data 段)捕获的。此段采用最简单的形式,并且使用与应用于任何其他段相同的缺省值对齐。还可以声明其他既可创建段又可为指定属性赋值的段属性。

链接编辑器的行为方式就好像在读入 mapfile 之前已经声明了这些段。请参见mapfile 选项缺省值

输入段声明时,请注意以下事项:


注 - 如果指定了 virtual_address 值,段将放置在该虚拟地址处。对于系统内核,此方法可生成正确的结果。对于通过 exec(2) 启动的文件,此方法将生成错误的输出文件,因为段与其页边界的相对偏移量是错误的。


使用 ?E 标志可以创建空段。此空段没有关联的节。此段可为 LOAD 段或 NULL 段。只能为可执行文件指定空 LOAD 段。这些段必须有指定的大小和对齐方式。这些段将导致在进程启动时创建内存保留空间。空的 NULL 段可添加程序头项,后处理实用程序可以使用这些程序头项。这些段不应指定任何附加属性。LOAD 段和 NULL 段允许具有多个定义。

使用 ?N 标志可以控制是否将 ELF 头和任何程序头作为第一个可装入段的一部分包括在内。缺省情况下,ELF 头和程序头包括在第一个段内。这些头中的信息通常由运行时链接程序用在映射的映像中。使用 ?N 选项将导致从第一个段的第一个节开始计算映像的虚拟地址。

使用 ?O 标志可以控制输出文件中各节的顺序。此标志用于与编译器的 -xF 选项一起使用。使用 -xF 选项编译文件时,该文件中的每个函数将放置在与 .text 节具有相同属性的单独节中。这些节称为 .text%function_name

例如,使用 -xF 选项编译包含 main()foo()bar() 这三个函数的文件时,会生成一个可重定位的目标文件,并会将三个函数的文本放置在名为 .text%main.text%foo.text%bar 的节中。由于 -xF 选项强制实行每节一个函数,因此使用 ?O 标志控制各节的顺序实际上是控制函数的顺序。

请考虑以下用户定义的 mapfile

        text = LOAD ?RXO;
        text: .text%foo;
        text: .text%bar;
        text: .text%main;

第一个声明将 ?O 标志与缺省文本段进行关联。

如果源文件中函数定义的顺序为 mainfoobar,则最终的可执行文件所包含的函数顺序为 foobarmain

对于具有相同名称的静态函数,还必须使用文件名。?O 标志强制按 mapfile 中的要求对节进行排序。例如,如果静态函数 bar() 存在于 a.ob.o 文件中,并且要将 a.o 文件中的 bar() 函数放置在 b.o 文件中的 bar() 函数之前,则 mapfile 项将显示为:

        text: .text%bar: a.o;
        text: .text%bar: b.o;

虽然此语法允许具有以下项:

        text: .text%bar: a.o b.o;

但此项不能保证将 a.o 文件中的 bar() 函数放置在 b.o 中的 bar() 之前。由于结果不可靠,因此建议不要使用第二种格式。

映射指令

映射指令指示链接编辑器如何将输入节映射到输出段。本质上,就是指定要映射到的段,并指明节为了映射到指定的段而必须具备的属性。节为映射到特定段而必须具备的 section_attribute_values 集合称为此段的入口条件。节必须完全满足段的入口条件,才能置于输出文件的指定段中。

映射指令的语法如下:

        segment_name : {section_attribute_value}* [: {file_name}+];

对于 segment_name,可以按任意顺序指定任何数量的 section_attribute_values,其中每个值由空格进行分隔。每个节属性最多允许具有一个节属性值。您还可以通过 file_name 声明指定节必须来自某个特定的 .o 文件。下表列出了节属性及其有效值。

表 B-2 节属性

节属性
section_name
任何有效的节名称
section_type
$PROGBITS

$SYMTAB

$STRTAB

$REL

$RELA

$NOTE

$NOBITS

section_flags
? [[!]A] [[!]W] [[!]X]

输入映射指令时,请注意以下几点:

段内节的排序

使用以下表示法可以指定节在段中放置的顺序:

        segment_name | section_name1;
        segment_name | section_name2;
        segment_name | section_name3;

以上述形式命名的节将按照它们在 mapfile 中列出的顺序放置在任何未命名的节之前。

大小符号声明

使用大小符号声明,可以定义新的全局绝对符号,以代表指定段的大小(字节)。可以在目标文件中引用此符号。大小符号声明的语法如下:

        segment_name @ symbol_name;

symbol_name 可以是任何合法的 C 标识符。链接编辑器不会检查 symbol_name 的语法。

文件控制指令

使用文件控制指令,可以指定共享目标文件中有哪些版本定义在链接编辑期间可用。文件控制定义的语法如下:

        shared_object_name - version_name [ version_name ... ];

version_name 是指定 shared_object_name 中包含的版本定义名称。