链接程序和库指南

版本控制节

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

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) 没有与版本关联的符号。 请参见创建弱版本定义 (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_versym 定义。此节包含具有以下结构的元素的数组。

typedef Elf32_Half      Elf32_Versym;

typedef Elf64_Half      Elf64_Versym;

该数组的元素数目必须等于关联符号表中包含的符号表项的数目。此数目根据该节的 sh_link 值确定。该数组的每一个元素都包含一个索引,这些索引可以具有下表中所示的值。

表 7–24 ELF 版本依赖性索引

名称 

值 

含义 

VER_NDX_LOCAL

0

符号具有局部范围的索引。 

VER_NDX_GLOBAL

1

符号具有全局范围的索引,并且会指定给基版本定义。 

 

>1

符号具有全局范围的索引,并且会指定给用户定义的版本定义。 

任何大于 VER_NDX_GLOBAL 的索引值都必须与 SHT_SUNW_verdef 节中的项的 vd_ndx 值对应。如果不存在大于 VER_NDX_GLOBAL 的索引值,则无需存在 SHT_SUNW_verdef 节。

版本依赖性节

版本依赖性节由 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

弱版本标识符。 

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

vna_other

目前未使用。

vna_name

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

vna_next

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