跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 11.1 链接程序和库指南 Oracle Solaris 11.1 Information Library (简体中文) |
链接编辑器创建的目标文件可以包含以下两种类型的版本控制信息:
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;
此成员标识该结构的版本,如下表中所列。
|
值 1 表示原始节格式。扩展要求使用更大数字的新版本。VER_DEF_CURRENT 的值可根据需要进行更改,以反映当前版本号。
此成员包含特定于版本定义的信息,如下表中所列。
|
对文件应用版本定义或符号自动缩减后,基版本定义将始终存在。基版本可为文件保留的符号提供缺省版本。弱版本定义 (weak version definition) 没有与版本关联的符号。请参见创建弱版本定义。
Elf32_Verdaux 数组中的元素数目。
版本定义名称的散列值。该值是通过使用散列表节中介绍的同一散列函数生成的。
从此 Elf32_Verdef 项的开头到版本定义名称的 Elf32_Verdaux 数组的字节偏移。该数组中的第一个元素必须存在。此元素指向该结构定义的版本定义字符串。也可以存在其他元素。元素数目由 vd_cnt 值表示。这些元素表示此版本定义的依赖项。每种依赖项都会具有各自的版本定义结构。
从此 Elf32_Verdef 结构的开头到下一个 Elf32_Verdef 项的字节偏移。
以空字符结尾的字符串的字符串表偏移,用于提供版本定义的名称。
从此 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;
此成员标识该结构的版本,如下表中所列。
|
值 1 表示原始节格式。扩展要求使用更大数字的新版本。VER_NEED_CURRENT 的值可根据需要进行更改,以反映当前版本号。
Elf32_Vernaux 数组中的元素数目。
以空字符结尾的字符串的字符串表偏移,用于提供版本依赖性的文件名。此名称与文件中找到的 .dynamic 依赖项之一匹配。请参见动态节。
字节偏移,范围从此 Elf32_Verneed 项的开头到关联文件依赖项所需的版本定义的 Elf32_Vernaux 数组。必须存在至少一种版本依赖性。也可以存在其他版本依赖性,具体数目由 vn_cnt 值表示。
从此 Elf32_Verneed 项的开头到下一个 Elf32_Verneed 项的字节偏移。
版本依赖性名称的散列值。该值是通过使用散列表节中介绍的同一散列函数生成的。
版本依赖性特定信息,如下表中所列。
|
弱版本依赖性表示与弱版本定义 (weak version definition) 的原始绑定。
如果为非零,则会向此依赖项版本指定版本索引。此索引用于在 SHT_SUNW_versym 内向此版本指定全局符号引用。
在 Oracle Solaris 10 发行版及更低 Solaris 版本中,不向依赖项版本指定版本符号索引。在这些目标文件中,vna_other 的值为 0。
以空字符结尾的字符串的字符串表偏移,用于提供版本依赖性的名称。
从此 Elf32_Vernaux 项的开头到下一个 Elf32_Vernaux 项的字节偏移。
版本符号节由 SHT_SUNW_versym 类型定义。此节由具有以下结构的元素数组构成。
typedef Elf32_Half Elf32_Versym; typedef Elf64_Half Elf64_Versym;
数组元素的数量必须等于关联的符号表中包含的符号表项的数量。此数量由节的 sh_link 值确定。数组的每个元素都包含一个索引,该索引可以包含下表中显示的值。
表 12-25 ELF 版本依赖性索引
|
可以为符号指定特殊的保留索引 0。可以出于以下任意原因指定此索引。
始终为非全局符号指定 VER_NDX_LOCAL。然而,这在实际操作中很少见。版本控制节通常仅与只包含全局符号的动态符号表 .dynsym 一起创建。
没有 SHT_SUNW_verdef 版本定义节的目标文件中定义的全局符号。
没有 SHT_SUNW_verneed 版本依赖性节的目标文件中定义的未定义全局符号。或者,其中的版本依赖性节未指定版本索引的目标文件中定义的未定义全局符号。
符号表的第一项始终为 NULL。此项始终接收 VER_NDX_LOCAL,但该值没有任何特定意义。
目标文件所定义的版本指定从 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 的版本索引,这表示该符号没有可用的版本控制信息。