JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris 11.1 链接程序和库指南     Oracle Solaris 11.1 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.  目标文件格式

文件格式

数据表示形式

ELF 头

ELF 标识

数据编码

节合并

特殊节

辅助节

COMDAT 节

组节

功能节

散列表节

移动节

注释节

重定位节

重定位计算

SPARC: 重定位

SPARC: 重定位类型

64 位 SPARC: 重定位类型

x86: 重定位

32 位 x86: 重定位类型

x64: 重定位类型

字符串表节

符号表节

符号值

符号表布局和约定

符号排序节

寄存器符号

Syminfo 表节

版本控制节

版本定义章节

版本依赖性节

版本符号节

13.  程序装入和动态链接

14.  线程局部存储

第 5 部分附录

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

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

索引

请告诉我们如何提高我们的文档:
过于简略
不易阅读或难以理解
重要信息缺失
错误的内容
需要翻译的版本
其他
Your rating has been updated
感谢您的反馈!

您的反馈将非常有助于我们提供更好的文档。 您是否愿意参与我们的内容改进并提供进一步的意见?

版本控制节

链接编辑器创建的目标文件可以包含以下两种类型的版本控制信息:

sys/link.h 中定义了这些节的组成结构。包含版本控制信息的节名为 .SUNW_version

版本定义章节

此节由 SHT_SUNW_verdef 类型定义。如果此节存在,则必须同时存在 SHT_SUNW_versym 节。这两种结构在文件中提供符号与版本定义之间的关联。请参见创建版本定义。此节中的元素具有以下结构:

typedef struct {
        Elf32_Half      vd_version;
        Elf32_Half      vd_flags;
        Elf32_Half      vd_ndx;
        Elf32_Half      vd_cnt;
        Elf32_Word      vd_hash;
        Elf32_Word      vd_aux;
        Elf32_Word      vd_next;
} Elf32_Verdef;
 
typedef struct {
        Elf32_Word      vda_name;
        Elf32_Word      vda_next;
} Elf32_Verdaux;

typedef struct {
        Elf64_Half      vd_version;
        Elf64_Half      vd_flags;
        Elf64_Half      vd_ndx;
        Elf64_Half      vd_cnt;
        Elf64_Word      vd_hash;
        Elf64_Word      vd_aux;
        Elf64_Word      vd_next;
} Elf64_Verdef;
 
typedef struct {
        Elf64_Word      vda_name;
        Elf64_Word      vda_next;
} Elf64_Verdaux;
vd_version

此成员标识该结构的版本,如下表中所列。

名称
含义
VER_DEF_NONE
0
无效版本。
VER_DEF_CURRENT
>=1
当前版本。

值 1 表示原始节格式。扩展要求使用更大数字的新版本。VER_DEF_CURRENT 的值可根据需要进行更改,以反映当前版本号。

vd_flags

此成员包含特定于版本定义的信息,如下表中所列。

名称
含义
VER_FLG_BASE
0x1
文件的版本定义。
VER_FLG_WEAK
0x2
弱版本标识符。

对文件应用版本定义或符号自动缩减后,基版本定义将始终存在。基版本可为文件保留的符号提供缺省版本。弱版本定义 (weak version definition) 没有与版本关联的符号。请参见创建弱版本定义

vd_ndx

版本索引。每个版本定义都有一个唯一的索引,用于将 SHT_SUNW_versym 项与相应的版本定义关联。

vd_cnt

Elf32_Verdaux 数组中的元素数目。

vd_hash

版本定义名称的散列值。该值是通过使用散列表节中介绍的同一散列函数生成的。

vd_aux

从此 Elf32_Verdef 项的开头到版本定义名称的 Elf32_Verdaux 数组的字节偏移。该数组中的第一个元素必须存在。此元素指向该结构定义的版本定义字符串。也可以存在其他元素。元素数目由 vd_cnt 值表示。这些元素表示此版本定义的依赖项。每种依赖项都会具有各自的版本定义结构。

vd_next

从此 Elf32_Verdef 结构的开头到下一个 Elf32_Verdef 项的字节偏移。

vda_name

以空字符结尾的字符串的字符串表偏移,用于提供版本定义的名称。

vda_next

从此 Elf32_Verdaux 项的开头到下一个 Elf32_Verdaux 项的字节偏移。

版本依赖性节

版本依赖性节由 SHT_SUNW_verneed 类型定义。此节通过指明动态依赖项所需的版本定义,对文件的动态依赖性要求进行补充。仅当依赖项包含版本定义时,才会在此节中进行记录。此节中的元素具有以下结构:

typedef struct {
        Elf32_Half      vn_version;
        Elf32_Half      vn_cnt;
        Elf32_Word      vn_file;
        Elf32_Word      vn_aux;
        Elf32_Word      vn_next;
} Elf32_Verneed;
 
typedef struct {
        Elf32_Word      vna_hash;
        Elf32_Half      vna_flags;
        Elf32_Half      vna_other;
        Elf32_Word      vna_name;
        Elf32_Word      vna_next;
} Elf32_Vernaux;

typedef struct {
        Elf64_Half      vn_version;
        Elf64_Half      vn_cnt;
        Elf64_Word      vn_file;
        Elf64_Word      vn_aux;
        Elf64_Word      vn_next;
} Elf64_Verneed;
 
typedef struct {
        Elf64_Word      vna_hash;
        Elf64_Half      vna_flags;
        Elf64_Half      vna_other;
        Elf64_Word      vna_name;
        Elf64_Word      vna_next;
} Elf64_Vernaux;
vn_version

此成员标识该结构的版本,如下表中所列。

名称
含义
VER_NEED_NONE
0
无效版本。
VER_NEED_CURRENT
>=1
当前版本。

值 1 表示原始节格式。扩展要求使用更大数字的新版本。VER_NEED_CURRENT 的值可根据需要进行更改,以反映当前版本号。

vn_cnt

Elf32_Vernaux 数组中的元素数目。

vn_file

以空字符结尾的字符串的字符串表偏移,用于提供版本依赖性的文件名。此名称与文件中找到的 .dynamic 依赖项之一匹配。请参见动态节

vn_aux

字节偏移,范围从此 Elf32_Verneed 项的开头到关联文件依赖项所需的版本定义的 Elf32_Vernaux 数组。必须存在至少一种版本依赖性。也可以存在其他版本依赖性,具体数目由 vn_cnt 值表示。

vn_next

从此 Elf32_Verneed 项的开头到下一个 Elf32_Verneed 项的字节偏移。

vna_hash

版本依赖性名称的散列值。该值是通过使用散列表节中介绍的同一散列函数生成的。

vna_flags

版本依赖性特定信息,如下表中所列。

名称
含义
VER_FLG_WEAK
0x2
弱版本标识符。
VER_FLG_INFO
0x4
SHT_SUNW_versym 引用用于提供信息,在运行时无需进行验证。

弱版本依赖性表示与弱版本定义 (weak version definition) 的原始绑定。

vna_other

如果为非零,则会向此依赖项版本指定版本索引。此索引用于在 SHT_SUNW_versym 内向此版本指定全局符号引用。

在 Oracle Solaris 10 发行版及更低 Solaris 版本中,不向依赖项版本指定版本符号索引。在这些目标文件中,vna_other 的值为 0

vna_name

以空字符结尾的字符串的字符串表偏移,用于提供版本依赖性的名称。

vna_next

从此 Elf32_Vernaux 项的开头到下一个 Elf32_Vernaux 项的字节偏移。

版本符号节

版本符号节由 SHT_SUNW_versym 类型定义。此节由具有以下结构的元素数组构成。

typedef Elf32_Half      Elf32_Versym;
typedef Elf64_Half      Elf64_Versym;

数组元素的数量必须等于关联的符号表中包含的符号表项的数量。此数量由节的 sh_link 值确定。数组的每个元素都包含一个索引,该索引可以包含下表中显示的值。

表 12-25 ELF 版本依赖性索引

名称
含义
VER_NDX_LOCAL
0
符号具有局部作用域。
VER_NDX_GLOBAL
1
符号具有全局作用域,并指定给基版本定义。
>1
符号具有全局作用域,并指定给用户定义的版本定义(SHT_SUNW_verdef 或版本依赖性 SHT_SUNW_verneed)。

可以为符号指定特殊的保留索引 0。可以出于以下任意原因指定此索引。

目标文件所定义的版本指定从 1 开始的版本索引,并且随版本变化每次增加 1。索引 1 保留用于第一个全局版本。如果该目标文件没有 SHT_SUNW_verdef 版本定义节,则该目标文件定义的所有全局符号均接收索引 1。如果目标文件具有版本定义节,则 VER_NDX_GLOBAL 将仅引用第一个此类版本。

其他 SHT_SUNW_verneed 依赖项中目标文件所需的版本将指定从 1 到最终版本定义索引之间的版本索引。这些索引也随版本变化每次增加 1。由于索引 1 始终保留用于 VER_NDX_GLOBAL,依赖项版本可用的第一个索引为 2

在 Oracle Solaris 10 发行版及更低 Solaris 版本中,不向 SHT_SUNW_verneed 依赖项版本指定版本索引。在此类目标文件中,任何符号引用都具有 0 的版本索引,这表示该符号没有可用的版本控制信息。